the problem seems to be related how logical pathnames are merged. The partial pathname that is created by Hunchentoot and then merged with the document root pathname is considered to contain a directory component by CL. Therefore, the directory component that you are matching in your logical pathname host definition is not present when the two partial pathnames are merged. To work around this behavior, I'd recommend that you define a separate logical pathname host for your document root.
TEST-LOGICAL-PATHNAMES> (setf (logical-pathname-translations "TEST") '(("foo;*.*.*" "/tmp/*")))
(("foo;*.*.*" "/tmp/*"))
TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt" #P"test:foo;"))
NIL
TEST-LOGICAL-PATHNAMES> (setf (logical-pathname-translations "TEST") '(("*.*.*" "/tmp/*")))
(("*.*.*" "/tmp/*"))
TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt" #P"test:foo;"))
(#P"/private/tmp/test.txt")
TEST-LOGICAL-PATHNAMES> (directory (merge-pathnames "test.txt" #P"test:"))
(#P"/private/tmp/test.txt")