Quello è il comportamento atteso
Per quello che so, in ogni (sub)shell tutte le variabili sono "globali" nel senso che sono visibili da parte di tutte le funzioni contenute e di tutte le subshell figlie (ma non da parte delle shell genitrici) a meno che non venga espressamente dichiarato il contrario (declare o local dentro una funzione).
Per rendere la cosa più elastica/complicata, local ha l'opzione -g che rende la variabile visibile anche fuori dalla funzione in cui viene assegnata