I ended up noticing that the PIs would eventually hang, but only within the bash shell (ssh would still answer incoming connections but hang after the MOTD) and only after running for a while.
More specifically, bash would hang after accepting new input but before launching a new command, not while running executing ones. And, even more tellingly, *all* running instances of bash would freeze seemingly together - once one froze, all others would suffer the same fate on the next command launch.
One time, while investigating, I happened to launch sh from an about-to-freeze shell and it worked correctly, allowing me to soft-reboot the system. So that gave me a hint that the only shell affected seemed to be bash.
I figured it was something to do with launching commands, not with bash itself.
I rebooted the PI and launched a bash session then attached gdb to it; I used the shell until the hanging behaviour appeared again, then broke into the bash process and looked at the stack trace - it was a deadlock in boost, in uv4l. I then went to confirm that there was usage of boost in uv4l.
Following that, looked in the environment everywhere for where uv4l would be used.
I eventually found it in /etc/environment, commented it out, and it solved the issue.
That was the process, in a nutshell.