Euqie, Что ты подразумеваешь под owner-ом MessageBox-а ?
Окно с хендлом hwnd, которое передается первым параметром?
Именно
Я думаю, что функция "MessageBox" синхронная (не знаю, имел ли в виду ssDev под словом "блокирующая" то же самое).
Синхронная -- значит, не передает управление следующей инструкции, пока не завершит свое выполнение.
В этом смысле - да. Но не все так просто. MessageBox, как и любой модальный диалог Windows, при создании запускает собственный цикл сообщений (message pump) и не выходит из него, пока диалог не будет закрыт (т.е. является синхронной функций в твоем понимании). Это не все. Специфика модальности ввода, как она реализована в Windows, предусматривает еще блокировку (disabling) окна-владельца. Но если нет владельца (соотв.параметр NULL), то и блокировки нет. Выглядит это в типичном GUI приложении как
возможность переключиться на любое другое незаблокированное окно приложения - например, вызвать меню для главного окна. Вот что имел в виду ssDev. Все это время обрабатывать сообщения будет не главный цикл приложения, а цикл диалогового окна. В этом смысле мы из диалога не выходим, пока он не будет закрыт. Для твоего примера с консольным приложением эффект блокировки достигается именно поэтому: других окон нет и переключиться некуда, а поток управления, действительно, стоит в MessageBox до его закрытия.
Насчет ситуации с деструктором. Я не знаком с исходниками Windows

но уверен, что системные функции типа GetMessage/PeekMessage, которые используются при организации цикла сообщений, проверяют наличие валидной
очереди сообщений, а она к моменту вызова деструктора
главного окна приложения уже скорее всего разрушена/невалидна. Если вызывать MessageBox в деструкторе любого подчиненного окна, думаю, никаких проблем не будет .