Судя по коду, процент выполнения у тебя ни от чего не зависит, просто длинна линии постепенно должна увеличиться от 0 до 100 процентов.
Тут в принципе вычисления не нужны, делаешь анимацию или animation или transition за определенное время, увеличивая например width
Даже если ты перепишешь свой цикл, так, чтобы он правильно передавал output_step в асинхронный requestAnimationFrame , цикл у тебя все равно останется синхронным, сначала пройдет весь цикл, и только после этого из очереди будут выполнятся твои requestAnimationFrame и меняться длинна. По сути это не будет анимацией выполнения цикла.
Если ты делаешь анимацию пачки асинхронных событий, например загрузки файлов, то, как сказали выше, лучше использовать requestAnimationFrame внутри асинхронного события (загрузка каждого файла из пачки)