Technically, OCaml's objects do not really support subtyping in the usual sense, but row polymorphism. There are many advantages of row polymorphism over subtyping, in particular it both is more expressive and works much better with type inference (subtyping and type inference do not mix well at all).
The primary problem with using either structural subtyping or row polymorphism for all records is that it requires a significantly more involved runtime implementation, and consequently, also is more expensive. Where simple records can trivially be translated into plain tuples, with field access being just indexing, structural subtyping or row polymorphism require the ability to transparently "slice" an object, i.e. view it under a supertype with random fields removed. In general, this requires either field lookup by hashing (such as Ocaml's objects), or evidence passing techniques, where the index of every field used by a function or any of its callees has to be passed as a hidden argument in addition to the actual record (that's what SML# is doing, for example).
In any case, Ocaml has polymorphic records, they are just called objects. But you can ignore all the class mess around them if you don't need it.