I don’t know what you mean by “nominally”, but a record-declaration declares these new field-names. Do it again (the identical declaration), and you redeclare the field-names. The new declarations obscure (or “shadow”) the old ones. But code or data that was created using the first declaration will necessarily be incompatible with the type of the second declaration.
Sort of, but probably not in the way you would expect them to be.
module type S = sig
type t
val x : t
end
module A = struct
type t = int
val x = 12
val y = 13
end
Here, A : S holds, but using A in a spot were a S is required will result in a copy of the module being made. That copy will only contain x. I believe that the reasoning for that is that accessing a module field is frequent, so it needs to be fast, but coercing a module to a subtype only happens when you pass it to a functor, which is not too often (hopefully).