I think that behind the scenes, a private data session ia actually doing a USE..AGAIN which explains why it behaves similarly.
The first open of a table defines the access for all other tables as far as I can see. So you have to open it SHARED and not make it readonly.
Then another datasession can open it readonly if it desires.
You will need to manage the coping of SET commands to a datasession.
I wrote a CLASS to do that. For me, it works fine but I know that it won't work well with Deleted records, because you have to SET DELETED before the tables are open. My class is instantiated in the LOAD() of the form.