Дело в том что отрисовка, выполнение js, пересчет стилей - все выполняется в одном потоке. Вы поменяли что-то в dom, это дело добавилось в очередь, а потом вы заблокировали поток синхронными вызовами ajax. Это поведение разнится от браузера к браузеру и от версии оной. Скажем в последних хромах можно включить эксперементальную фичу, которая выполняет перерисовку страницы в отдельном потоке.
Именно по этому работа с сетью и т.д. должна быть асинхронной. То есть если вам нужно что-то сделать, то обходя циклом ваш массив данными, вы отправляете запрос (асинхронно) и сохраняете в массив promise, который возвращает функция .ajax(). Если вам нужно что-то сделать когда все запросы завершатся - просто ставите
jQuery.when где нужно и если все прошло удачно отрабатываете.