setTimeout (devolución de llamada) seguido de un bucle while nunca se dispara

Tengo el siguiente código a continuación (nota, agregaré más código en el bucle más adelante, pero primero necesito que esto funcione):

var calls_on = true;
function hunt(max, ext, duration){
    if(duration != '0' || duration != false || duration != 0){
        duration = duration * 1000; // milliseconds to delay before stopping calls
        var t=setTimeout(function(){calls_on=false;}, duration);
    }
    while(calls_on){
        alert('reached');
    }
    alert('test');
}

He confirmado que se está ejecutando el condicional de "duración" y que se está configurando el controlador de tiempo de espera. Sin embargo, este bucle nunca termina, y nunca veo cómo se ejecuta la devolución de llamada setTimeout. Cuando elimino el bucle por completo, funciona bien (ya que eso lo convierte en el único código en la función).

Cualquier ayuda sería apreciada. ¿Está setTimeout de alguna manera fuera de alcance? ¿Cómo es el bucle descarrilar el tiempo de espera?

Respuestas a la pregunta(2)

Su respuesta a la pregunta