Static arrays are copy by value, dynamic arrays are reference counted copy by reference with lazy copy mechanism.
Basically while (unlike strings) you can edit arrays in place, changing the array value across multiple references, whenever you can SetLength it guarantees that the refcount will always be 1.
So best practice is to just assign the references and only if you really need a unique copy make it unique, e.g. with SetLength(arr, Length(arr))
In your example, because SetLength is called it's guaranteed to be a unique copy, so no need to do any copying afterwards.
Also note that if you use threading, arrays are not thread safe, so uniquify them for each thread