Интересно, могут ли функции win32 асинхронно запускаться в одном потоке.
Нет. Функции win32 обслуживают системные вызовы. Они запускаются в своем собственном контексте (или, вы можете считать их системными потоками). Они могут блокировать ваш поток (синхронные системные вызовы) или не блокировать ваш поток (асинхронные вызовы). Для этих синхронных вызовов это похоже на работу в вашем потоке (заблокирован), но на самом деле он работает в другом контексте.
Я видел пример асинхронной функции в MSDN https://docs.microsoft.com/en-us/windows/win32/wsw/asyncmodelexample Это связано с многопоточностью?
Да. Этот пример реализует многопоточность (два потока). Один из потоков использует асинхронное уведомление (функция обратного вызова) для уведомления другого потока о результатах.
ВЕРНО ли, что асинхронные функции могут быть реализованы только с помощью многопоточности?
Нет. Как упоминалось ранее, некоторые системные функции являются асинхронными (или с синхронными, и с асинхронными параметрами). Вы можете использовать эти функции для выполнения асинхронных операций. Это похоже на то, что система предоставляет вам многопоточность без необходимости самостоятельной реализации многопоточной программы.
Обратите внимание, что системные вызовы выполняют только системные службы, четко определенный набор системных функций. Если вам нужно добиться чего-то другого, кроме системных служб в другом потоке, тогда да, вам нужен другой поток для этого.