I've found out that putFromLoads were not propagated to other caches asynchronously, probably due to locking issues of local vs. synchronous vs. asynchronous commands.
This can be resolved by locking on the command when it's going to be executed locally (that is when it is not just sent to origin for forwarding), and executing both an asynchronously distributed write and local one (because we want the modifications to be applied synchronously, not waiting until primary owner replicates the change back).
As the updates applied to the cache entry do not rely on the order, the origin -> primary -> backup replication is completely unnecessary and we can always distributed the update to all owners directly form origin, and without FIFO-ordering in JGroups. That can be achieved by simple overload of distribution interceptor.
Fixed in master (5.2), backports pending.