Когда выполняется код, на странице ничего не рендерится.
Как только код преврался или закончил выполнение, то перед передачей управления другому асинхронному коду может произойти (а может и не произойти) куча событий, в том числе обновляется страница в соответствии со сделанными изменениями в ней.
Так что во время первой итерации setInterval (или перед созданием setInterval) нужно затемнить блок. Не важно, в начале и в конце функции это делать, отрисовка начнется только после выхода из функции. А в последней итерации setInterval, соответственно, нужно убрать затемнение.