Matt J's way works, by creating multiple struct arrays, working your way down the nested fields. It's functional, but not very fast, since you are creating new arrays each time, unless you are going to be accessing all of the data at that level.
On the other hand, this is kind perfect for cellfun:
x = cellfun(@(c) c.Pose.Position.X, myCell);
This works great when the field you are accessing always contains scalar data. If it contains vector data, or text, you'd have to use 'UniformOutput',false, which would output another cell array.
If you are concerned about performance, it may be faster to create a local function to handle the access of all data within a deeply-nested message at once. Something like:
[x, y, z] = cellfun(@extractPose, myCell);
function [x, y, z] = extractPose(msg)
pos = msg.Pose.Position;
x = pos.X;
y = pos.Y;
z = pos.Z;