It is dating back to the very early days of Caché. Even before my time @ ISC
(my guess >25 years)  There was a lot of $Z* stuff e.g. $ZU(..)  
That was not meant to be used for applications.
Just for internal use in system utilities. With no public Docs.
Some became public over time, mostly renamed,  and were documented.
I just found it by examing some related system functions.

it is possible. but an OREF is always a LOCAL reference !
see this example
 

SAM>kill
SAM>set a=##class(Sample.Person).%OpenId(2)
SAM>set b=##class(Sample.Person).%OpenId(12)
SAM>set c=##class(Sample.Person).%OpenId(111)
 
SAM>set x="3@Sample.Person"   ;what we look for
SAM>set o=""                  ;this will be our OREF  
SAM>zw
a=<OBJECT REFERENCE>[4@Sample.Person]
b=<OBJECT REFERENCE>[3@Sample.Person]
c=<OBJECT REFERENCE>[2@Sample.Employee]
o=""
x="3@Sample.Person"
SAM>;; now we convert our String x to OREF o
SAM>for  set o=$zobjnext(o) quit:(o="")||($p(o,"?")=x)
 
SAM>zw   ;; we did it
a=<OBJECT REFERENCE>[4@Sample.Person]
b=<OBJECT REFERENCE>[3@Sample.Person]
c=<OBJECT REFERENCE>[2@Sample.Employee]
o=<OBJECT REFERENCE>[3@Sample.Person]
x="3@Sample.Person"
SAM>

The key-oneliner:
for  set o=$zobjnext(o) quit:(o="")||($p(o,"?")=x)

you just can copy an already existing reference  SET rerf=a from the example above


to show all open objects:
Do $System.OBJ.ShowObjects()
Oref      Class Name                    Ref Count
----      ----------                    ---------
1         Sample.Person                 1
2         Sample.Person                 1
3         Sample.Employee               1
4         Sample.Company                1

 

OR

Do $System.OBJ.ShowObjects("/detail=1")
Oref      Class Name                    Ref Count
----      ----------                    ---------
1         Sample.Person                 1
+----------------- general information ---------------
|      oref value: 1
|      class name: Sample.Person
|           %%OID: $lb("2","Sample.Person")
| reference count: 1
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|                DOB = 32225
|               Name = "Ubertini,Brian S."
|                SSN = "231-12-5250"
+----------------- swizzled references ---------------
|   i%FavoriteColors = ""  <Set>
|   r%FavoriteColors = ""  <Set>
|             i%Home = $lb("9177 First Court","Bensonhurst","SC",42658)  <Set>
|             r%Home = ""  <Set>
|           i%Office = $lb("260 First Place","Larchmont","NV",99593)  <Set>
|           r%Office = ""  <Set>
|           i%Spouse = ""
|           r%Spouse = ""
+--------------- calculated references ---------------
|                Age   <Get>
+-----------------------------------------------------
 
2         Sample.Person                 1
+----------------- general information ---------------
|      oref value: 2
|      class name: Sample.Person
|           %%OID: $lb("12","Sample.Person")
| reference count: 1
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|                DOB = 33423
|               Name = "Waal,Jeff V."
|                SSN = "137-61-1656"
+----------------- swizzled references ---------------
|   i%FavoriteColors = ""  <Set>
|   r%FavoriteColors = ""  <Set>
|             i%Home = $lb("3872 Washington Place","Newton","NJ",80886)  <Set>
|             r%Home = ""  <Set>
|           i%Office = $lb("4339 Second Drive","Albany","PA",79202)  <Set>
|           r%Office = ""  <Set>
|           i%Spouse = ""
|           r%Spouse = ""
+--------------- calculated references ---------------
|                Age   <Get>
+-----------------------------------------------------
 
3         Sample.Employee               1
+----------------- general information ---------------
|      oref value: 3
|      class name: Sample.Employee
|           %%OID: $lb("111","Sample.Employee")
| reference count: 1
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|                DOB = 50109
|               Name = "Yezek,Chelsea F."
|                SSN = "227-72-8394"
|             Salary = 69426
|              Title = "Executive WebMaster"
+----------------- swizzled references ---------------
|          i%Company = 2  <Set>
|          r%Company = ""  <Set>
|   i%FavoriteColors = ""
|i%FavoriteColors(1) = "Blue"
|i%FavoriteColors(2) = "Yellow"
|   r%FavoriteColors = ""  <Set>
|             i%Home = $lb("7573 Main Drive","Bensonhurst","MA",97453)  <Set>
|             r%Home = ""  <Set>
|            i%Notes = ""  <Set>
|            r%Notes = ""  <Set>
|           i%Office = $lb("7403 Oak Place","Vail","NH",46047)  <Set>
|           r%Office = ""  <Set>
|          i%Picture = ""  <Set>
|          r%Picture = ""  <Set>
|           i%Spouse = 89
|           r%Spouse = ""
+--------------- calculated references ---------------
|                Age   <Get>
+-----------------------------------------------------

4         Sample.Company                1
+----------------- general information ---------------
|      oref value: 4
|      class name: Sample.Company
|           %%OID: $lb("9","Sample.Company")
| reference count: 1
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|            Mission = "Leaders in dynamic nano-application development instruments for the desktop."
|               Name = "BioDyne LLC."
|            Revenue = 928565856
|              TaxID = "X6668"
+----------------- swizzled references ---------------
|        i%Employees = $lb("Sample.Employee","Company",4,"many",1,1)  <Set>
|        r%Employees = ""  <Set>
+-----------------------------------------------------
  

Then you can use %%OID to generate your own OREF

like set ref=##class(%Persistent).%Open($lb("9","Sample.Company"))

It's not really comfortable
 

@ is just a separator
while n is just an internal sequence number within your partition
see this example

SAMPLES>s a=##class(Sample.Person).%OpenId(2)
SAMPLES>s b=##class(Sample.Person).%OpenId(12)
SAMPLES>s c=##class(Sample.Employee).%OpenId(111)
SAMPLES>s d=##class(Sample.Company).%OpenId(9)
 
SAMPLES>zw
 
a=<OBJECT REFERENCE>[1@Sample.Person]
b=<OBJECT REFERENCE>[2@Sample.Person]
c=<OBJECT REFERENCE>[3@Sample.Employee]
d=<OBJECT REFERENCE>[4@Sample.Company]
SAMPLES>

read docu

• classmethod CompileList(ByRef list As %String = "", qspec As %String = "", ByRef errorlog As %String, ByRef updatedlist As %String) as %Status

Compile a list of items specified in 'list' and separated by commas, or an array list("item.MAC")="". You can also use ? or * wild cards and if you wish to exclude items pass ' before the item name which also supports wild card, e.g. "User.*.cls,'User.T*.cls". Each item on the list is sufixed by the type of item it is so to compile a class and a routine you could specify 'class.cls,routine.mac' The order of compilation is INT, CLS, MAC, CSR, CSP.
qspec is a list of flags or qualifiers which can be displayed with 'Do $system.OBJ.ShowQualifiers()' and 'Do $system.OBJ.ShowFlags()'. Note that while /mapped=0 qualifier applies to the pattern passed in by only searching the default routine database, however any compile is done in the current namespace. So it is possible a routine/class found with /mapped=0 may not be visible in the current namespace or may be a different version if there are complicated package mappings.