Я бы попробовал так, как только заходят на страницу запускается функция
setInterval(() => {}, 30);
в которой все время прибавляется к полосе прогресса, например, по пикселю, попутно с этим проверяется document.readyState и если оно будет равно interactive то прогресс переходит заполняется на 2/3. Затем останавливаем интервал и ждем ответа следующей функции.
window.onload = function(){};
как только она сработает, плавно дотягиваем прогресс до конца и закрываем прелоадер.
Можете почитать про события загрузки