Podrías hacerlo así:
Código Javascript
:
Ver originalvar valor, texto, idx, equiv;
$("[name^=foo]").on("change", function(){
valor = this.value; //El valor seleccionado
idx = this.selectedIndex; //El número de opción seleccionada
texto = this.options[idx].innerHTML; //El texto de la opción seleccionada
equiv = $("[name^=foo]").index(this); //El número de lista en la que se produjo el cambio
$("[name^=bar]")
.eq(equiv) //Busco a la lista equivalente
.find("option") //Tomo a sus opciones
.eq(idx) //Tomo a la opción equivalente
.val(valor) //Le asigno el valor
.text(texto) //Le asigno el texto
.prop("selected", true); //La dejo seleccionada
});
Ahora, la explicación. Tenemos dos grupos de arrays de listas de tres listas cada una (pueden ser más o menos). En el código JS, declaro tres variables que usaré más adelante (las declaro al inicio para no tener que hacerlo en cada ocasión en la que seleccione una opción). Luego, cuando elija un valor de cualquiera de las listas cuyo nombre empiece por 'foo', ejecuto una función. En dicha función, tomo al valor seleccionado, al número de opción seleccionada (si son tres y selecciono a la segunda, el valor será 1, recordando siempre que se empieza a contar desde 0), el texto de la opción seleccionada y el número de lista con la que estamos trabajando actualmente (el mismo caso que el de las opciones). Luego, del conjunto de listas cuyo nombre empiece por 'bar', tomo a la equivalente con la lista actual, busco a sus opciones, tomo a la opción equivalente con la opción seleccionada en la primera lista y le asigno el valor y texto de la misma, además, la selecciono, quedan visible.
DEMO
Podrías hacerlo en más o menos pasos, pero decidí mostrarlo de esta manera para que se pueda entender con facilidad. Si tienes dudas, pregunta.
Saludos