На этот вопрос сложно ответить в контексте таймера POSIX. API окна SetTimer создает таймер в потоке графического интерфейса, который опирается на механизм диспетчеризации очереди сообщений потока - это означает, что где-то в потоке вы вызываете GetMessage / DispatchMessage.
Если вы пишете код не-GUI, необходимость реализовать цикл сообщений является неестественным ограничением: - Ядро Windows использует объекты синхронизации (вместо сигналов) в качестве способа для рабочих потоков (то есть не-GUI) быть предупреждены о событиях. CreateWaitiableTimer создаст дескриптор, который может быть передан WaitForSingleObject / WaitForMultipleObjects в рабочем потоке.
Кроме того, вы можете создать рабочий поток - внедрить в него таймер (GUI или ядро) и просто вызвать ваш (очевидно, это должен быть потокобезопасный) объект, когда таймер сигнализируется.
Выбор действительно зависит от того, насколько точно будет POSIX-подобное приложение.