boost имеет библиотеку asio, которой я раньше не пользовался (ее нет в списке утвержденных сторонних библиотек НАСА).
Мой собственный подход состоял в том, чтобы написать код чтения файла дважды, один раз для Windows, один раз для POSIX aio API, а затем просто выбрать подходящий для связи.
Для Windows используйте OVERLAPPED (вы должны включить его в вызове CreateFile, а затем передать структуру OVERLAPPED при чтении). Вы можете либо установить событие завершения (ReadFile), либо вызвать обратный вызов завершения (ReadFileEx). Вероятно, вам потребуется изменить основной цикл событий, чтобы использовать MsgWaitForMultipleObjectsEx, чтобы вы могли либо дождаться событий ввода-вывода, либо разрешить выполнение обратных вызовов, в дополнение к получению сообщений окна WM_. MSDN имеет документацию для этих функций.
Для Linux есть либо fadvise и epoll, которые будут использовать кэш readahead, либо aio_read, который позволит выполнять реальные асинхронные запросы на чтение. Когда запрос завершится, вы получите сигнал, который вы должны использовать для отправки сообщения XWindows и пробуждения цикла обработки событий.
Обе детали немного различаются в деталях, но общий эффект одинаков - вы запрашиваете чтение, которое завершается в фоновом режиме, а затем цикл обработки событий пробуждается после завершения ввода-вывода.