I think these resources probably cover it but I’ll try to answer below as well.
It’s not the only way since PureScript has anonymous records, so t.field1 and _.field2 $ t are ways to access fields by name. If using a newtype or a record these would be (unwrap t).field1 and _.field2 <<< unwrap $ t.
Another way would be to use optics, which could handle setting/getting/updating fields and also account for the newtype wrapper.
_field1 :: Traversal' T Int
_field1 = _Newtype <<< prop (SProxy :: SProxy "field1")
_field2 :: Traversal' T Number
_field2 = _Newtype <<< prop (SProxy :: SProxy "field2")
preview _field1 t1
Correct. At least not in the way you might expect coming from Haskell, which is to say not without defining functions to destructure things first and then wrap them back up.
Aside from wrap/unwrap, you could use optics, or use functions like over to update the underlying record.
over T \t -> t { field1 = t.field1 + 1 }
over T _ { field2 = 0.0 }
If you mean a newtype of a record, then I think this is accurate.