もう解決しているようですが、原因はナツキさんが指摘している通りだと思います。関数NOARRは、OUT引数で返しているので呼び元Aの参照値Aに反映されます(実装が実体のコピーなのか参照値のコピーかは分かりません。)。しかし、命令Aの引数Aの参照値は、値渡しであり、呼び元のAとは別物になり、命令Aの中の参照値の変更は命令Aの中だけで、命令Aの呼び元の参照値Aには反映されません。(参照値Aが指している実体の変更は、反映されます。)したがって、OUT引数で返すことで、解決するはずです。例のようなグローバル変数ではなく、ローカルな配列変数の場合には、OUT引数で対応する必要があります。(通常は戻ったときに解放されるので必要性は低そうですが・・・)なお、ご存じかとは思いますが、INとOUTの仮引数を別名にして実引数を同名にすることで実装可能です。