Estuve leyendo detenidamente el problema que planteas y hay un par de cosas que no me quedan claras:
¿El valor de los selects los estas guardando cuando se produce el onChange del 2º select o mediante un submit común de un form?
¿Cuando dices "Lo curioso es que el valor se guarda correctamente pero el select me queda vacio" te refieres a que el select queda deshabilitado y con "Selecciona opción..." seleccionada o vacío totalmente en blanco?
Si estás intentando capturar los valores en un sibmit del form, debes recordar de añadir las etiquetas form correspondientes ya que el script no las trae:
Código PHP:
<?php if(!empty($_POST)) print_r($_POST); ?>
<form action="" method="post">
<div id="demoDer">
<select disabled="disabled" name="estados" id="estados">
<option value="0">Selecciona opción...</option>
</select>
</div>
<div id="demoIzq"><?php generaPaises(); ?></div>
<button type="submit">Enviar</button>
</form>
Cuando se produzca el submit los campost select como el resto de los inputs que podrías tener en el form volverán a su estado inicial... los select no quedarán como los dejó el usuario.
No se si te estoy comprendiendo bien, cualquier cosa me dices.
Saludos.