I’ never done this but here is what I would try:
- User A: account with personal contacts (read/write)
- User Y: account with global addressbook (read/write): shares the global addressbook to user Z (read only)
- User Z: receives the shared global addressbook from user Y (read only)
There can be several different user accounts like the one from user A.
On the mac:
- add carddav account for User A
- add carddav account for User Z
I would always use service discovery on Mac OS or iOS. I explained here how that works for caldav. For carddav the same applies (just exchange caldav with carddav):
Good luck!