Я думаю, что объяснение @ 1800 пока самое близкое.
Когда вы перемещаете окно из потока, которому это окно не принадлежит, я думаю, что Windows не использует SendMessage для доставки таких вещей, как WM_WINDOWPOSCHANGING, в процедуру окна перемещенного окна. Вместо этого, чтобы гарантировать, что оконная процедура вызывается только в правильном потоке, она отправляет сообщение WM_WINDOWPOSCHANGING и блокирует, пока она не будет выбрана циклом обработки событий в правильном потоке. Однако этот цикл событий не работает - он заблокирован, ожидая завершения MoveWindow.
Решения от @totaland и @Logan Capaldo будут работать.
Может быть, вам не нужно ждать, пока ваше окно не сдвинется. Или, если вам нужно быть уверенным, используйте MsgWaitForMultipleObjectsEx и запустите небольшой цикл обработки событий для обработки отправленных сообщений.