Почему WinAPI выполняет синхронную запись?
В мануале прямо написано, что асинхронная операция может выполниться и синхронно - тут уж как венда решит.

Кстати, чем вам Boost::asio не угодил?
Возможно, дело в этом https://docs.microsoft.com/ru-RU/troubleshoot/wind...

Расширение файла
Еще одна причина синхронного завершения операций I/O — это сами операции. На Windows любая операция записи в файл, который расширяет его длину, будет синхронной.

Примечание

Приложения могут сделать ранее упомянутую операцию записи асинхронной, изменив допустимую длину данных файла с помощью функции, а затем выпустив SetFileValidData WriteFile .

Надо пробовать

Но еще остаётся неясным в чём проблема с незаписью последней порции в режиме FILE_FLAG_NO_BUFFERING даже с учётом выравнивания всего и вся на 512; возможно в вызове CancelIO в close (хотя перед этим есть ожидание wait).