@DaveTheCoder @dotted -- It's more complicated than that, which I think is important for efficient usage. There's a web of inter-linked engine issues around how to better-document or -implement this behavior: e.g. #15265.
My gist from reading the underlying pool_vector.cpp
code is that the pool arrays are pass-by-value wrappers around a reference to the actual backing vector. These wrappers then implement copy-on-write behavior by only ever directly mutating the original backing vector when there is only a single reference to that vector, and otherwise point themselves to a copy which they then mutate.
This means you can treat the pool arrays as immutable, and passing them around for read-only access has no more overhead than passing by reference. But of course the downside is that the behavior is very confusing if one doesn't anticipate it!