se definisci la variabile all'interno della funzione e' locale, cioe' si perde nel momento in cui la funzione termina.
Il setTimeout(), eseguendo l'istruzione contenuta quando la variabile non esiste piu' genera l'errore.

var finestra;
function apri() {
var link = arr_links[Math.floor(arr_links.length*Math.random())];
finestra = window.open(link);
//window.setTimeout("if(finestra != null && !finestra.close) finestra.close();", " ", _tout);
window.setTimeout("finestra.close()", 3000);
}
window.setTimeout("apri()", 4000);

se poi tutto il ciclo deve ripetersi ogni 4 secondi devi mettere l'ultima istruzione anche all'interno della funzione:

var finestra;
function apri() {
var link = arr_links[Math.floor(arr_links.length*Math.random())];
finestra = window.open(link);
//window.setTimeout("if(finestra != null && !finestra.close) finestra.close();", " ", _tout);
window.setTimeout("finestra.close()", 3000);
window.setTimeout("apri()", 4000);
}

window.setTimeout("apri()", 4000);

ciao