Great - glad it's fixed for you ..Here's a little more background on the lifecycle and component creation model ..
In your IScriptControl, IExtenderControl, ExtenderControl types, the 'GetScriptDescriptor' returns descriptors for client-side components that the server control or extender 'handles'. That is the scoping of the client-side components are those 'encapsulated' by the server control or extender. In this manner you'll be creating components that you know about and can handle references between them as needed.
AddComponentProperty means that in the client an instance reference from one 'component' to another is set. This is handled in the client by Sys.Application and $create using a '2-pass' model which means components can be created in any order and have circular references if needed. Creation of components at the particular lifecycle stage news the component, sets simple properties and events, registers the component etc., but delays setting complex reference properties for a '2nd pass'. AddElementProperty essentially causes $gets in the $create, and these are simple property sets to DOM elements only, through ID. Note that all this happens after the scripts are loaded.
If a page developer in their app, wishes to $create client-side components directly, then ordinarily they can do this in the pageLoad lifecycle stage in the app. (this is called on GET and async requests). However, in this case, if the components have circular references, then there are two approaches to achieve this. 1) hook to the init stage (Sys.Application.add_init()) and in that hander perform the $creates as necessary. This means that the 2-pass model will handle these; 2) In pageLoad 'wrap' the $creates with a call to Sys.Application.beginCreateComponents before the $creates and Sys.Application.endCreateComponents after.
The alternative model of using a 'string' ID, is a totally valid model therefore only requiring the simple AddProperty through the descriptor. As you state, in the setter you can internally in your component use $find to locate that reference component if needed. This also might be a simpler approach if you really intend your client-side component to allow the page developer to set 'references' from other components that they construct.