Что делает поток, которому принадлежит целевое окно? Он должен качать сообщения, чтобы иметь возможность получать сообщения, которые либо отправлены, либо отправлены на него. Обычно это делается с помощью цикла GetMessage / TranslateMessage / DispatchMessage. Если поток выполняет что-то еще - например, блокирует ожидание завершения события, мьютекса или ввода-вывода или занят в каком-то другом цикле, выполняющем вычисления, он не будет получать сообщения: SendMessage в поток будет блокироваться, а PostMessage отправлю, но не получу.
Если этот целевой поток должен управлять событиями или аналогичными им, а также ему принадлежит окно, вам может понадобиться использовать MsgWaitForMultipleObjects в цикле сообщений этого потока.