They are ment to be set statically in your model. If you want to change it dynamically, you need to add a method to your model (or use a base model or a trait if you need this in multiple models) that can set these values, as they are protected.
If you don't have a master/slave database system with different read and write servers, you don't have to do anything with $_write_connection, you only have to set $_connection.
Every database object has an internal connection object, which is persistent. These database objects are stored by name (in your code, $conn_str). As written before, this name must match a database configuration entry. From the code I've seen, you're doing it correctly.
I've done a quick scan of the Orm query code, and as far as I can see, it uses the defined connection anywere.
Could you enable the profiler (in your config.php), en enable database profiling on all your database definitions ( add $mydb['profiling'] = true to your dynamic code ) and check exactly which queries go wrong?
The profiler will show you exactly which db connection name is used for every query run.
The ORM caches objects on modelname + primary keys. So yes, if you switch connections, you may bump into cached items if the databases contain records with the same key values.
You might have to add a method to your model to clear the cache when you switch: