Функция async выполняется синхронно до первого await. Каждый await прерывает выполнение функции и возвращает управление в вызывающую функцию. Если это первый await, то выполнение продолжается в вызывающей функции, но там тоже может быть await (но может и не быть). Поэтому постепенно выполнение переходит в event-loop. После await выполнение продолжается непосредственно в event-loop, поэтому стек вызовов будет содержать только его. Когда выполнение находится в event-loop, он просто берет следующую задачу из очереди. Аsync function - это абстракция над промисами и их колбэками, которые выполняются в очереди микротасок, которую event-loop обрабатывает, пока она не станет пустой.
В примере с вопросом:
1. Event-loop вызывает колбэк http сервера, который включает роутер.
2. Роутер вызывает наш колбэк, который может выполняться как синхронно, так и асинхронно (например, express выполняет синхронно).
3. Наш колбэк отправляет запрос в базу данных, получает промис и останавливается на await.
4. Управление возвращается роутеру, а он возвращает его в модуль http, в итоге все возвращается в event-loop.
5. Event-loop берет следующую задачу из очереди, которой может быть запрос к http серверу или ответ от базы данных.