Raga ho risolto, vi spiego se dovesse servire a qualcun altro, il problema era dato dal "remove" della option:
quando si elimina una option viene tolto un elemento dall'array e di conseguenza si spostano gli indici di tutti i successivi elementi !!
La mia soluzione è quindi di usare due cicli, uno che prima inserisce gli elementi nella seconda select, il secondo che li toglie dalla prima...a ritroso.

codice:
	for(i=0; i<origine.options.length;i++){
		if(origine.options[i].selected==true){	
			var elNew = document.createElement('option');
				elNew.text = origine.options[i].text;
				elNew.value = origine.options[i].value;

			try {destinazione.add(elNew, null); } // standards compliant; doesn't work in IE		  			
			catch(ex) {destinazione.add(elNew); } // IE only					
		} 
	}
	for(i=origine.options.length-1; i>=0;i--){
		if(origine.options[i].selected==true)	
			origine.remove(i);
Magari c'è un metodo anche più veloce ... ma almeno ora funziona