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