There is a separate problem with display only succeeding once, but I believe that's orthogonal to this issue. I'll make it a separate bug.
Nevertheless, inspecting the class's fields with aid of struct() suggests that it works as intended now, so I'm closing this.

Jaroslav, could you please take a look at this problem? There seems to be some issue with reference counting here, as the call to the manipulate method is somehow changing the size of item.baseobj.val (a cell array of objects). I'm not yet seeing where that is happening and since you've done a lot of work with indexing and assignment for classes, maybe you will spot it sooner than I can.

I'm not sure whether it will give you some clues or help with debugging, but rewriting the @derivobj/manipulate.m function from

I have got a hierarchy of object classes:
baseobj
derivobj - derived from baseobj
deriv2obj - derived from derivobj

baseobj and derivobj define a method manipulate(). In baseobj, this method assigns a random number to the .val property. In derivobj/deriv2obj, it calls a manipulate() method on each member of a cell array .val. While manipulate() operates correctly on derivobj objects, it crashes on deriv2obj objects:

The error occurs in the for loop in @derivobj/manipulate, when trying to access the .val field entries in a deriv2obj. The same code works perfectly for derivobj objects.