l'errore è che con la riga (e la sua corrispondente W3C)
codice:
tempobj.attachEvent("onchange", function(){prova(tempobj)} );
stai assegnando il riferimento ad una funzione (anonima) che elabora il riferimento all'oggetto tempobj.
Il valore di tempobj è valutato dalla funzione anonima run-time e siccome tu nel ciclo lo avevi modificato, tempobj conterrà il riferimento dell'ultimo oggetto puntato.

Quello che devi fare per ottenere il tuo risultato è quello di mantenere "vivo" il riferimento al singolo oggetto valutato nel ciclo e non ricoprirlo dall'ultimo elaborato.
Per far ciò, aggiungo al tuo codice la funzione createListener che riceve come parametro proprio un riferimento ad un oggetto. La funzione è utilizzata proprio per mantenere vivo il riferimento ad un oggetto.
Ogni volta che viene chiamata la funzione createListener il riferimento all'oggetto passato viene mantenuto nello scope della funzione e sarà poi riutilizzato dal vero e proprio gestore dell'evento.

codice:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
	<head>
		<title>a</title>
		<meta name="vs_defaultClientScript" content="JavaScript">
		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
		<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
		<meta name="ProgId" content="VisualStudio.HTML">
		<meta name="Originator" content="Microsoft Visual Studio .NET 7.1">
		<script id="clientEventHandlersJS" language="javascript">
<!--

function createListener( ths, funzione){
	ths.metodo = function(event){
					funzione.call( ths, event);
				};
		}

function prova(){ alert(this.id);}


function window_onload() {

	if (document.all || document.getElementById) 
	{ 
		for (var i = 0; i < document.form1.length;i++) 
		{ 
			var tempobj;
			tempobj = document.form1.elements[i];
			createListener( tempobj, prova) ;

			if(tempobj.attachEvent)
				tempobj.attachEvent("onchange", tempobj.metodo );
			else if(tempobj.addEventListener)
				tempobj.addEventListener("change", tempobj.metodo, false);
		} 
	}
	
}


		</script>
	</head>
	<body MS_POSITIONING="FlowLayout" language="javascript" onload="return window_onload()">
		<form id="form1" name="form1" language="javascript">
			<SELECT size=4 ID="SelectNome" NAME="Select1">
				<OPTION value="0">Stefano</OPTION>
				<OPTION value="1">Carlo</OPTION>
				<OPTION value="2">Nicola</OPTION>
				<OPTION value="3">Pietro</OPTION>
			</SELECT>
			<SELECT size=4 ID="SelectColori" NAME="Select1">
				<OPTION value="0">Rosso</OPTION>
				<OPTION value="1">Verde</OPTION>
				<OPTION value="2">Azzurro</OPTION>
				<OPTION value="3">Giallo</OPTION>
			</SELECT>
			
		</form>
	</body>
</html>
spero di essermi spiegato bene.
ciauz

PS: il nome createListener non è proprio azzeccato per questo codice, ma lo lasciato perchè è il nome originario della funzione che uso nella libreria che ho scritto per la gestione degli eventi.