У вас там requestAnimationFrame, то есть 60 фпс. Это примерно 16ms на кадр (1000/60).
Нужно замерять время, которое тратится на отрисовку (Performance.now(), или даже просто new Date())
Если оно сравнимо с 16ms, или больше чем 16, то нужно пропускать некоторые кадры. Выводить каждый второй или каждый третий.
Анимация будет не настолько плавной, но будет меньше тормозов.
Второй вариант: переписать все на css анимации, вдруг полегче пойдет?