LA
То что ты сейчас описал происходит не из-за того, что не закончен какой-то там асинхронный процесс.
Браузер обрабатывает хтмл-страницу построчно, синхронно, строка за строкой, если не указаны специальные атрибуты. Подгружает скрипты, стили и парсит хтмл-разметку, создавая DOM. И если скрипт, работающий с DOM, подключен в начале страницы, браузер выполнит его тут же, независимо от того существует ли еще DOM или нет, и только после обработки скрипта продолжит парсинг страницы дальше.
Поэтому всегда рекомендуется подключать скрипты в конце страницы, перед закрывающим тегом боди. Когда браузер дойдет до этого места и начнет выполнять скрипт, модель DOM уже будет создана, поэтому никаких defer и onload не потребуется