Como te comente anteriormente php se ejecuta primero que javascript
cuando hiciste esto
Código PHP:
Ver originalwhile(isset($_SESSION["categorias"][$i])) { ?>
if(slcCategorias.value==<?=$_SESSION["categorias"][$i]->get_id_categoria();?>) {
<?php
$_SESSION["Ci"]=$i;
?>
Automaticamente php te creo todo lo que este dentro del while la cantidad de veces que vale sizeof($_SESSION["categorias"]).
cuando llamas la primera opcion realmente no estas llamando al
la variable $_SESSION["Ci"] por que ya esa variable fue interpretada.
cuando llamas la opcion 2
te muestra el valor real de $_SESSION["Ci"] que en este caso sera el valor total
de sizeof($_SESSION["categorias"]).
lo que pudieras hacer para que te des cuenta, es limpiar la variable $_SESSION["Ci"], fijate bien
al final del while de la primera opcion agregar unset($_SESSION["Ci"]); y luego corre el codigo y veras que no te va alerta que $_SESSION["Ci"] vale sizeof($_SESSION["categorias"])