HSPは根本的に1行ずつ順番に解釈するインタプリタなので
#deffuncの外で定義された変数は文法的に問題が無くても
単純にその行を通っていないだけだと思います。
更に言うと個人的には#deffuncなどは
『引数や戻り値を設定できるラベルの変形』だと思っています。
つまり
#module
hoge = 10
#deffunc foo
mes hoge
return
#global
foo
これと
goto *l_2
*l_1 // モジュールの開始
hoge = 10
*foo
mes hoge
return
// モジュール終了
*l_2
gosub *foo
これは同じような意味になるではないかと。
後者のソースをたどっていくとわかると思いますが
モジュールの中でhogeに数値を入れていても
fooの外なので流れ的に hoge=10 の行は通らずに
ゼロが表示されるだけになってしまいます。
モジュール内で使った変数にモジュール外からアクセスすることも出来ますし、
Cなど他言語の書き方を疑似的に再現しているだけであって
『関数や命令の外に書いた変数はグローバル変数、中で書けばローカル変数』
ではなく
『どこに書いても全てがグローバル変数』
と考えるべきなのではないかなと思いました。