TL;DR: musisz przerzucić alert do kolejnego zadania (taska);
setTimeout(() => { alert("blabla"); }, 0); // to zamiast alert()
Dłuższa wersja:
JS wykonuje się w "zadaniach" (taskach), gdzie strona się nie "odmalowuje" w trakcie wykonywania danego zadania (tylko pomiędzy zadaniami). Co więcej, alert() jest blokujący i blokuje wykonanie danego zadania do końca.
Więc musisz przerobić kod tak, żeby funkcja zmiana() wykonała się do samego końca, potem strona się automatycznie "przemalowała", a dopiero potem wywołał się alert.
Ten kod który napisałem po prostu wrzuca kolejne zadanie na listę do wykonania za 0 milisekund (czyli de facto od razu po tym zadaniu (i po automatycznym przemalowaniu)), w który wywoływany jest nasz alert. Może da się to zrobiła ładniej, ale to zadziała ;)
Więcej info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop