Синхронный запрос - это запрос с ожиданием ответа. Т.е. скрипт создал объект, а объект послал запрос на сервер, это сразу, мгновенно не происходит. И пока этот запрос обрабатывается на сервере скрипт "висит", скрипт просто "висит", он ждет ответ с сервера. Дальше скрипт не выполняется, браузер ничего не делает, он ждет ответ с сервера. Если сервер работает долго или связь с сервером медленная, то это "зависание" может быть даже заметно на глаз.
Асинхронный запрос - это запрос без ожидания ответа от сервера. Т.е. скрипт создал объект, а объект послал запрос на сервер. При этом скрипт продолжает выполняться дальше и не ждет ответа от сервера. В какой-то момент данные вернуться. И тут вступает в действие событие onreadystatechenge. Сам объект меняет это событие, когда у него меняется свойство readyState. Для события создается собственная функция, в которой проверяется свойство readyState.