We iterate entity-by-entity because that's how the data is laid out in messages: Entity1, C1, C2, …, Entity2, C1, ….
Component-by-component would be more cache-friendly, but requires additional tracking, which might negate the benefits of cache locality.
Worth benchmarking.