Eine mögliche Lösung für dieses Problem wäre, eine Schnittstelle für den ProgramManager bereitzustellen. Diese implementiert er und übergibt einen Zeiger auf sich selbst beim Erstellen an den SubManager. Du hast also quasi (beispielhaft) einen IProgramManager, und der TSubManager übernimmt als Konstruktorparameter nicht TProgramManager, sondern IProgramManager. Der Nachteil hierbei liegt darin, dass du die Eigenschaften quasi doppelt pflegen muss (einmal im Interface und einmal in der Implementierung.
Oder aber, wenn es nicht auf Geschwindigkeit oder Typsicherheit ankommt, könntest du auch die Eigenschaftsnamen als String übergeben. Dann bräuchte dieses Interface nur noch zwei, drei Methoden für den Zugriff.
Je nachdem, welche Informationen vom ProgramManager der SubManager braucht, kannst du ihm diese vielleicht auch auf anderem Wege zur Verfügung stellen. Wenn es beispielsweise nur eine Handvoll Informationen wie der Registrypfad sind, könnte der ProgramManager diese Information dem SubManager beim Erstellen mitliefern. Alternativ muss das Interface ja nicht alle Eigenschaften des ProgramManager beinhalten, sondern nur die von SubManagern benötigten (wenn es immer dieselben sind).
Edit: Noch eine winzige Kleinigkeit: Parent wird mit einem r geschrieben