Где то под капотом nodejs работает обычный event loop, все асинхронные методы складывают в очередь свои события, каждый кусок кода выполняется, будучи вызван именно от сюда.
Все методы должны как то уметь работать асинхронно, т.е. будить event loop при завершении работы, если не умеют - наверное для них (каждого вызова) запускается свой поток, внутри которого работает обычный синхронный вызов, по окончании работы которого так же дергается тот же event loop.
например мы хотим асинхронно файл прочитать - метод получает от операционной системы хандлер объекта, который умеет работать асинхронно, как только получили порцию данных - в цикле event loop завершает работать метод ожидания хоть какого то события (список хандлеров в параметрах либо это специализированный семафор, который все дергают) и обрабатывает событие, которое его разбудило - т.е. видим что пришли данные и вызываем callback метод, у казанный в парметрах вызова работы с файлом, в параметрах - результаты работы. После их обработки снова в цикле вызывается метод ожидания. Таким образом основной цикл работает в одном потоке, но ожидания только если нет событий.