Не знаю ка обстоит дело с играми на JS, но на C++ в функцию update передаётся время с прошлого апдейта, как правило, в милисекундах. Это время удобно учитывать для перемещения объекта.
void update(float dt)
{
float traveled = getSpeed() * dt + getTravaledDistance();
setTraveledDistance(traveled);
}
При этом функция отрисовки и функция обновления выполняются в одном потоке (иначе нужно будет синхронизировать потоки, лочить некоторые методы и т.д.).
А если игра вдруг подвисла, то в апдейт может прийти довольно большое значение времени и тогда игровые элементы могут сделать резкий скачок. Чтобы избавиться от этого можно обрезать максимально возможное время в главном цикле:
// main loop
while(!done)
{
float dt = getTimeSinceLastUpdate();
dt = min(33.3, dt); // equals 30 fps
update(dt);
render();
}