One of them is connected to the wired network and it gets an IPv4 address from my DHCP server, and a valid IPv6 SLAAC address, so it's clearly seeing the router advertisements.
The other 2 MR52a are meshed to the wired one.
Any wireless client associated with the wired MR52 gets an IPv6 address from DHCPv6 (same server as DHCPv4) and IPv6 works just fine for such clients: they can access resources on the LAN over IPv6 and on the Internet.
Any wireless client associated with a mesh MR cannot use IPv6 even if I assign them a static IPv6 address.
Actually it's slightly more complicated than that: a client on a mesh MR can ping internal resources with IPv6 but that's all they can do; for example I can't SSH over IPv6 from a laptop to another machine. If I want to do SSH over the mesh I have to specify ssh -4. The ping reaches the destination device: tcpdump on the destination shows it. SSH does not reach the destination. This is the case for multiple pairs of devices, and is true in both directions.
IPv6 bridging is definitely enabled network-wide. So it seems that if you want to do anything other than ping with IPv6, you and your destination device have to be either wired or associated with the mesh root.
I didn't have this problem with Cisco Aironet. It just didn't arise.
@chrissw 27.6 only supports a basic set of IPv6 features and I'd bet that mesh connectivity isn't fully supported. 28.x is in early release phase with public release expected soon and includes a lot more IPv6 functionality, though I haven't tested meshing. I'll see if I can find a more definitive answer.