how to implement read-only rows or snapshots of rows
You could make them Temporal Tables, and add a ParentObject.SnapshotTime column.  Then every time you update that column, you'll get a new version of the parent object, and you can issue temporal queries on the related tables.