A prefab can only reference objects that are a part of the prefab. A far a the prefab is concerned, objects outside of it don't exist at all, because a prefab is not a part of the scene.
A prefab
instance can reference objects outside of it because it's a part of the scene. This is just how Unity works, and makes perfect sense if you think about it.
UICenterOnChild.selectedObject tells you the "selected" object (technically it's just an object in the center, not a selected object).
UICamera.selectedObject tells you the actual selected object, of which there is only one in the scene at any given time.
I'm not sure what NGUITools.GetChild is supposed to be. What is passing a game object supposed to do in that? You can access list of children like any other game object -- via transform.GetChild. There isn't just one child. There can be 0 or more children. If you need to find something like a label inside a prefab, consider either using transform.FindChild("name of game object").GetComponent<UILabel>(), or preferably creating a helper script that has public references to your objects like labels, sprites etc, placed on the prefab itself:
using UnityEngine;
public class MyClass : MonoBehaviour
{
public UILabel title;
public UILabel content;
}
Once you have this script attached to the prefab you can set the values in inspector. Changing the label's text at that point becomes as simple as:
GameObject go = NGUITools.AddChild(gameObject, prefab);
MyClass script = go.GetComponent<MyClass>();
script.title.text = "New Title";
script.content.text = "New Content";