Почему код выполняется асинхронно?
Потому что это асинхронный код. Какого еще ответа вы ждали?
Вот здесь вы вешаете слушателя события. И он сидит себе и ждет:oReq.addEventListener("load", reqListener);
Дальше вы инициируете вызов - это как ввести адрес сайта в браузере и нажать ввод. Но интернет медленный, сайт тормозной. Пройдет какое-то время.
И вот, наконец, когда страница соизволит загрузиться, выстрелит событие "load", которое и будет отловлено слушателем - выполнится, наконец-то, функция reqListener()
Разрыв, рвущий нить выполнения этого кода и делающий его из синхронного асинхронным – где-то внутри  объекта XMLHttpRequest и не виден невооруженным глазом.
Теоретически, внутри мог бы быть и синхронный код, который по методу send() сразу же явно дергал функцию, которую мы передали как слушателя события. Но это был бы уже не тот XMLHttpRequest, каким мы его любим.