I found the error, it was a bug in asio. Turns out that vxWorks has a rather small send buffer, or at least small enough where the call ends up blocking while partially transmitting the buffer. Asio didn't adjust for that. Since most modern OS don't have a small buffer like that, apparently nobody has caught that error (and in fact, I wasn't able to duplicate it on a non-cRio platform).
Filed a bug at
https://svn.boost.org/trac/boost/ticket/2953
I've now got boost::threads and boost::asio working on vxWorks correctly. Let me know if you're interested, I'll be releasing a patchset soon.