Ты используешь update методы сцен (Я подозреваю, что update сцен вызывается из Graphics.update, но ручаться не могу). Через них ты добавляешь секунды к своим часам и надеешься, что метод update дергается ровно 60 раз в секунду. Это не всегда так. Бывает, что спрайтов в сцене очень много, их их физически нельзя все обновить за 1/60 секунды. Бывает, что на update сцен завязывают не только обновление спрайтов. Твои часы тому доказательство, да и я так делаю в своем Ticker. Слабый компьютер это только усугубит. Фактически, в любой игре, где FPS не строго 60, полагаться на такой счетчик - ненадежно.
Я сказал тебе про sleep для примера такого длительного update. По поводу wait - скорее всего он увеличивает счетчик Graphics.frame_count, но во время ожидания update у сцены не вызывается. Т.е. ты можешь запросто не добавить секунду во время. Это будет больше всего заметно в стандартной боевке, там в Window_BattleLog очень много вызовов wait.
Я сделал демку. Там несколько десятков параллельных событий и проигрывание анимации.
Скрин проблемы
Демка с проблемой
Как это можно поправить.
Часы показывают разницу времени между началом отсчета и текущим моментом. Положи в переменную метку времени на момент запуска часов (@time = Time.now.to_i). Все что тебе нужно знать во время обращения за текущим временем - сколько времени пользователь установил вначале и сколько секунд прошло со времени запуска часов (Time.now.to_i - @time). Из реальных секунд ты можешь всегда посчитать все остальное.