В данном случае помогает подход обратного обобщения.
Вы спускаетесь на самый нижний уровень и смотрите, что передается вниз и зачем нужен референс на родителя.
Если с родителем нет никакой работы, а просто так написан код, то выкидываете этот референс.
По итогу у вас будет вырисовываться нечто такое (циклы и бойлерплейт я опустил для наглядности)
<Tasks>
<Task>
<Tabs>
<Tab>
<AddressList>
<Address>
<Properties>
<Property attributes="attr" />
...
</Properties>
</Adress>
...
</AddressList>
</Tab>
...
</Tabs>
</Task>
...
</Tasks>
Каждый компонент будет получать данные через сервис или через родительские атрибуты.
Ваша задача очень сильно зависит от того, как обновляются адреса, свойства, атрибуты и т.д. Насколько сильно это раздроблено в бэкенде, можно ли делать частичные обновления и т.д.