isValid = false; while (isValid == false) { let night = Number(window.prompt("pick a night")); if (typeof night == 'number' && night >= 1 && night <= 8) { isValid = true; } } document.write(night); //not accessibleDebes definir la variable night fuera del ciclo while, así:
[...] let night let isValid = false; while(isValid == false) { night = Number(window.prompt("pick a night")); if(typeof night == 'number' && night >= 1 && night <= 8){ isValid = true; } } document.write(night); [...]let es una variable de alcance de bloque, es decir, solo será accesible en el ciclo while. Si desea acceder a él fuera del ciclo while, declárelo como una variable var que es un ámbito global.
Para ser honesto, ni siquiera recomendaría usar un ciclo while.
Además, un problema con su código es que está verificando si typeof night === 'number' , pero siempre será un number ya que envolvió el valor en Number() . NaN en sí es del tipo de número.
<script> const getNight = () => { const night = +window.prompt('Pick a night:'); if (isNaN(night) || night < 1 || night > 8) { alert('Try again.'); return getNight(); } return night; }; document.write(getNight()); </script>