First and barely worth mentioning, ljsync uses default values instead of the configuration file values for the server host, port, and uri. (trivial ljsync patch)
Second, syncitems was not sending entry properties for clustered journals! This led me to notice that something similar was happening with editjournal.bml. When editing a journal entry (for a clustered user), properties are not inserted into the form, but instead left blank... (I can't believe nobody noticed this earlier?)
It turns out that LJ::Protocol::getevents and LJ::Protocol::editevent were calling LJ::load_log_props2 without first calling LJ::load_props($dbs, "log"); to fill the property names cache.
I created a trivial ljprotocol.pl patch, which adds a call to LJ::load_props before calling LJ::load_log_props2, but I wonder why LJ::load_log_props2 doesn't just call LJ::load_props itself, instead of failing? This would perhaps be the better fix...?