After 10 hours of tracing and debugging I figured out the solution: I added a manual marshalling before the CXF Producer, like this:
<marshal ref="myDataFormat"/>
<to uri="cxf:bean:myCxfEndpoint?dataFormat=PAYLOAD"/>
Why: My assumption was that it's OK to send any POJO to the Camel CXF Endpoint and it'll be able to handle the Conversion. The only thing I can think of is it matters that in what order Camel loads the Converters. Every second time when it worked in fuse it could make a POJO -> String -> CxfPayload conversion so it could transitively resolve the conversion. I decided not to rely on this transitive conversion logic and checked all the loaded converters. I found that there are certain direct converters registered in the registry between XML Node/Element -> CxfPayload classes. So I decided to trick Camel's logic with marshalling my POJO.