I would definitely be curious to understand how, or rather see an explicit demonstration of the CPs going non-deterministic. I presume some of this has to do with the run loop, and out of band changes to the observed properties causing unexpected changes at unexpected times. Basically a queue management problem.
That being said why not have your own concrete properties or variables and then manage the state changes in explicit setter and getter functions. Nothing says you have to use CPs and observers. Although they are seemingly convenient.
Also, as far as data flow patterns go, I was always inspired by this talk given by Steve Kane. It really points out intriguing ways to think about how to stitch components together and think about bus pattern for passing around state. If you haven’t seen it, well worth watching. Although a bit old now.