Ti suggerisco un sistema, ma non ho voglia di scrivere il codice

Quando cicli sul resultset, invece di scrivere in output immediatamente le opzioni raccogli i dati in un array a due dimensioni, usando come prima chiave l'iniziale del comune (una cosa del genere: $array[$iniziale][] = $comune)

Poi produci l'output con un doppio foreach nidificato, tipo:

Codice PHP:
foreach($array as $iniziale => $comuni) {
  
//qui produci l'optgroup usando l'iniziale
  
foreach ($comuni as $comune) {
    
//qui produci la option col comune
  
}