Чем асинхронность отличается от однопоточности в Javascript?
Асинхронность помогает единственному основному потоку не висеть в ожидании завершения какой-либо длительной внешней, по отношению к потоку, операции или наступления некоего события.
Представьте, что у вас всё работает синхронно. Тогда, если вы в фоне подгружаете какие-либо данные, то основной поток будет ждать завершения их загрузки и браузер перестанет реагировать на любые действия пользователя - нажатия на клавиши, движения мыши и т.п.
При асинхронности есть некая очередь. Любое событие (нажатие клавиши, движение мыши, скролл, завершение сетевой операции, срабатывание таймера) добавляет в эту очередь новую задачу. Браузер берёт задачи из этой очереди и выполняет их в единственном потоке. Эти задачи могут порождать процессы во вспомогательных потоках (инициация таймера, запуск сетевого процесса), которые в конце работы добавят новые задачи в очередь.
И таки да, если из задачи запустить несколько сетевых операций подряд, то они будут работать одновременно во вспомогательных потоках, при этом каждая такая операция при своём завершении добавит новую задачу в очередь. То же самое и с таймерами, все таймеры ведут отсчёт одновременно, добавляя задачи в очередь по истечению заданного времени.

Аналогия: представьте, что вы начальник и к вам стоит очередь подчинённых. Каждому из них вы даёте задание и он уходит это задание выполнять.
Синхронный процесс - вы ожидаете возвращения подчинённого и его доклада о выполнении задачи, затем даёте ему новое задание и так, пока задания для него не закончатся. Потом переходите к следующему подчинённому.
Асинхронный - вы даёте задачу, подчинённый уходит, вы даёте задание следующему и т.д. По выполнению задачи вернувшийся подчинённый встаёт в общую очередь к вам.
Асинхронность в первую очередь нужна, когда идут запросы на сервер.
Тут, имхо, будет хороша такая аналогия:
Начальник ─ программист.
Грузчик 1шт. ─ интерепритатор жс.
Начальник ставит грузчику 2 задачи: разгрузить фуры и перетащить коробки партиями из А в Б.
На разгрузку одной фуры грузчику надо 15 минут, фуры приходят 1 раз в час, фур 5 штук, 1ая уже готова к разгрузке.
Перетащить одну партию коробок требует 5 минут, новая партия поступает сразу после доставки предыдущей, всего 50 партий.
Синхронный ─ это когда грузчик разгружает фуру каждый час, попивая чаёк с печеньками в ожидании следующей фуры, и только после того, как разгрузит все фуры, начнёт таскать коробки. На всё про всё уйдёт более 8 часов.
Асинхронный ─ это когда грузчик работает без продуху, только разгрузил фуру, сразу начал таскать коробки, приехала фура, начал разгружать её, и т.д. На всё про всё уйдёт чуть более 5 часов.

Надеюсь, логика ясна.