山本です。

http://www.opengroup.org/onlinepubs/007904975/utilities/xcu_chap02.html#tag_02_13_02

を見た限りでは、FNM_PATHNAME があるときは [ruby-dev:22879] のように振る舞い、
FNM_PATHNAME がないときは、fnmatch('hoge[/]hoge') は '/' を領域指定してると解釈するみたいです。
その手があったか。これで胸のつかえがとれました。

# 上の閲覧には登録がいるんですけど、やっぱりここに引用するとまずいんでしょうか?

  FNM_SEPMATCH == !FNM_PATHNAME

  FNM_SEPMATCH がないときは、
    *, ? は / にマッチせず、'/' は [ ] に優先するので、[ ] が '/' を含むことはありえない
      File.fnmatch('hoge[/X]hoge', 'hogeXhoge')    => false
      File.fnmatch('hoge[/X]hoge', 'hoge/hoge')    => false
      File.fnmatch('hoge[/X]hoge', 'hoge[/X]hoge') => true
    **/ は、ディレクトリ再帰のようにマッチする(オプション)
    Dir.glob も、これと同じ動作をすべきである。
    Dir.glob に FNM_CASEFOLD や FNM_SEPMATCH が指定されたときは、例外(警告)を出す

    マジック文字の優先順位は
      1. { }
      2. /
      3. [ ], *, ?

  FNM_SEPMATCH があるときは、
    *, ? は / にマッチして、[ ] が '/' を含むなら、範囲指定で '/' もマッチする
      File.fnmatch('hoge[/X]hoge', 'hogeXhoge', FNM_SEPMATCH) => true
      File.fnmatch('hoge[/X]hoge', 'hoge/hoge', FNM_SEPMATCH) => true
    **/ は */ と同様の意味しかもたない

    マジック文字の優先順位は
      1. { }
      2. [ ]
      3. /, *, ?