That looks like it should work, presuming that you're only natting a single public IP, and that there are no rules ahead of it in either chain which would match before those. Especially DROP rules.
For the benefit of our readers, this seemed to be the trick. Replacing the -A switch with -I causes the rules to be "inserted" into the first position of each chain, and thus they will be adhered to before anything else. Also, after doing some further reading, it seemed to be helpful to turn off the tracking of the ipv6 packets as well. I have added the following to my DD-WRT iptables:
iptables -t nat -I POSTROUTING --proto ! 41 -o vlan1 -j MASQUERADE
iptables -t nat -I PREROUTING -i vlan1 -p 41 -j DNAT --to $ipv4b
iptables -I FORWARD -s $ipv4a -i vlan1 -j ACCEPT
It still might not work for everyone, but it is working for me. Thanks for your guidance! Now, on to radvd...
Phil
You probably didn't need to exclude proto 41 from masquerading. As long as the DNAT is in there and the ACCEPT is in the FORWARD chain before any rule which would drop the traffic, it should have worked. I typically put rules like that ahead of the normal match rule in the FORWARD chain for established/related traffic so that the counters shown with the -v flag give me some stats on the traffic for that protocol.
Also FYI, if you didn't know, you can also use a number after -I or --insert to place a rule in front of the numbered line anywhere in the chain. You can list the line numbers by adding --line to "iptables --list". For example, if you wanted to put something in front of rule number 3, you could do "iptables -I FORWARD 3 <rule>".