for each partner you need to select a company or allow empty the company that the partner is visible to everyone.
So what I ask to create a virtual company V that contains all object coummun between company A and company B (partners , users, products...) . A and B are childs V.
and create another company C.
so company A and company B both deal with the same customer but not let him be seen by company C.
So your structure will :
And if this solution does not meet your needs you have to do create a new module to change this logic .
you can start by see this line in res.partner:
'company_id': fields.many2one('res.company', 'Company', select=1),
change to :
'company_id': fields.many2many('res.company', id1='partner_id', id2='company_id', string='Company'),
and you will have many modificat.