Welcome to a race condition. Let me give the order things happen in, and it may make more sense.
The user types
http://www.google.com into the browser.
The OS queries DNS for
www.google.com. (If the user uses OpenDNS, for example, it breaks here)
The m0n0wall cacheing DNS looks up IP and returns it or fails. (If it fails, it breaks here)
The web browser makes a get on port 80 to 72.14.204.99.
Captive portal captures that get and reroutes it to m0n0wall:8000
The user receives the page and displays it. (Unless they are running some web safe software that checks all web pages)
Log in.
Now with NAT, you may never be passing through the captive portal. With the get redirected, the portal never sees it, and login never happens. Or, the redirect happens, and then you pass through the portal, which tries to redirect you, but the web browser is trying to hit the proxy to proxy the login page, which fails which...
What you may want to do, is stack two firewalls. Set captive portal on the inner m0n0wall, and the nat redirect to squid on your outer firewall.