Видимо раньше Вы внутри цикла выполняли полезную нагрузку и отдавали рабочие ресурсы процесса между делом, сам того не подозревая. Везде, где используют бесконечный цикл, а не пользуются системой сообщений-событий для организации программы — организуют раздачу сообщений или таймаут вручную в обязательном порядке. Возьмите для примера приложения на Win API:
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
— здесь цикл подвисает до получения сообщений от системы. Ну или другой пример (что пришел в голову), Python Pygame:
while True:
# код приложения
tick(60) # отдадим время свыше необходимого фреймрейта системе
Ну а на JS делать такое — моветон, совершенно неправильно. Поскольку любое JS приложение должно быть событийно-ориентированным, реагировать на действия пользователя, как и большинство UI-приложений. Если Вам нужно выполнять действие с интервалом, используйте:
function main() {} // вместо Вашего напрасного цикла
setInterval(main, 50); // вызывайте каждые 50 миллисекунд, например