Hola:
Si temporizas con setTimeout, el segundo parámetro puede ser variable, por ejemplo puedes usar un valor aleatorio:
finbucle = false;
function recurrente() {
if (!finbucle)
setTimeout("recurrente()", Math.floor(Math.random () * 1000));
}
Si puse bien las cosas, la recurrencia será aleatoria entre 0 y 1000 milisegundos hasta que el evento que quieras ponga la variable global finbucle a true.
Saludos