RISOLTO!
Ora funziona perfettamente.
Se qualcuno avesse bisogno vi trascrivo il codice con la relativa struttura del database necessaria.

PS: mi resta solo un dubbio sulla prima select e su come funzioni la scelta dell'array da utilizzare per popolare le provincie dopo aver scelto la regione. Il codice cosi com'è funziona correttamente ma secondo me è rivedibile...

Struttura DB:
TBL_REGIONI (id_regione, regione, stato_id)
TBL_PROVINCIE (sigla, provincia, regione_id)
TBL_CITTA (id_citta, citta, sigla_prov)


codice:
<form name="ins">
<select name="id_regione" onChange="riempi_prov(this.options.selectedIndex)">
<?php
$query = "SELECT * FROM tbl_regioni ORDER BY regione";
$result=mysql_query($query);
echo "<option value=''> </option>";
while($row=mysql_fetch_array($result)){
echo "<option value='" . $row['id_regione'] . "'>" . $row['regione'] . "</option>";
}
?>
</select>


<select name="provincia" onChange="riempi_citta(this.options.value)">
<option value="...">...</option>
</select>

<select name="citta">
<option value="...">...</option>
</select>


</form>






<SCRIPT>
var prov=new Array();
var sigle=new Array();
<?
$query = "SELECT * FROM tbl_regioni ORDER BY regione";
$result=mysql_query($query);
$counter=1;
while($row = mysql_fetch_array($result)) {
    $query2 = "SELECT * FROM tbl_provincie WHERE regione_id=" . $row['id_regione'] . " ORDER BY provincia";
    $result2=mysql_query($query2);
    $counter2=0;
    $str_prov="";
    $str_sigla="";
    while($row2=mysql_fetch_array($result2)){
        if($counter2>0){
            $str_prov.=",";
            $str_sigla.=",";
          }
        $str_prov.='"'.$row2['provincia'].'"';
        $str_sigla.='"'.$row2['sigla'].'"';
        $counter2++;
    }
    echo "prov[" . $counter . "]=new Array(" . $str_prov . ") \n";
    echo "sigle[" . $counter. "]=new Array(" . $str_sigla . ") \n";
    $counter++;
}
?>

function riempi_prov(source) {

  with (document.ins.provincia) {
  
      //svuoto la select prima di ripopolarla
      num_option=options.length;
      if (num_option != null) {
        for(a=num_option;a>=0;a--){
          options[a]=null;
        }
      }
  
      options[0]=new Option("...","");
      for (i=1;i<=prov[source].length;i++)
        options[i]=new Option(prov[source][i-1],sigle[source][i-1])
      options.selectedIndex=0;
  }
}


</SCRIPT> 



<script language="javascript">
    var citta=new Array();
    var idcitta=new Array();
    <?
    $query = "SELECT * FROM tbl_provincie ORDER BY provincia";
    $result=mysql_query($query);
    $counter=1;
    while($row = mysql_fetch_array($result)) {
        $query2 = "SELECT * FROM tbl_citta WHERE sigla_prov='" . $row['sigla'] . "' ORDER BY citta";
        $result2=mysql_query($query2);
        $counter2=1;
        $str_citta= '"' . $row['sigla'] . '"';
        $str_idcitta= '"' . $row['sigla'] . '"';
        while($row2=mysql_fetch_array($result2)){
            if($counter2>0){
                $str_citta.=",";
                $str_idcitta.=",";
              }
            $str_citta.='"'.$row2['citta'].'"';
            $str_idcitta.='"'.$row2['id_citta'].'"';
            $counter2++;
        }
        echo "citta[" . $counter. "]=new Array(" . $str_citta . ") \n";
        echo "idcitta[" . $counter. "]=new Array(" . $str_idcitta . ") \n";
        $counter++;
    }
    
    
    ?>
    
    function riempi_citta(source) {

      var trovato;
      var j;
      
      
      // ricava l'indice dell'array tenendo conto che in posizione [j][0]
      // c'è il valore passato dalla select precedente (in questo caso la sigla della prov.)
      trovato = false;
      j = 1;
      while (trovato == false) {
        if (citta[j][0] == source)
          trovato = true;
        j++;
      }
      j = j-1;
      
      //popolo la select option
      with (document.ins.citta) {
      
            //svuoto la select prima di ripopolarla
            num_option=options.length;
            if (num_option != null) {
              for(a=num_option;a>=0;a--){
                options[a]=null;
              }
            }
      
            options[0]=new Option("...","");
            for (i=1;i<=citta[j].length;i++)
              options[i]=new Option(citta[j][i],idcitta[j][i])
            options.selectedIndex=0;
          }
    }
</SCRIPT>