Какой подход использовать в многопоточном программировании на Си?
Можно. Макросы генерируют код, после чего он компилируется. Проблемы с многопоточностью могут возникнуть только в случае, если вы сделаете макрос, который генерирует не потокобезопасный код
Макросы это просто один из инструментов, который предоставляет язык. Использовать его или не использовать ваше дело, многопоточность тут не при делах.
Один и тот же код может моментально стать не потокобезопасным, как только появляются не защищенные разделяемые между потоками данные, которые использует код. При этом сам код может не поменяться, просто вы решили добавить поток и использовать в нем те же данные. Данные сразу же становятся разделяемыми и нужно их использование защищать везде, где они раньше использовались "беззащитными", будь то обычный код или код в макросах.