This subVI is inefficient. There are two problems, one major, one minor.
Adding array elements is very expensive. Every time you add an element to an array, LabVIEW finds a new memory location which can hold the new array size, allocates that memory, copies the array to it, and adds your new element on the end. Sometimes, LabVIEW can just allocate a piece of memory at the end of the current array, so the copy is not necessary. However, you cannot depend on this. Adding an array element thus gets progressively slower as your arrays get bigger. You can easily work around this issue by creating an array big enough for you use at the beginning and using the Replace Array Subset VI to replace elements in it. To pass data out, use the Array Subset VI and only pass out what is valid. You will need to keep track of what is valid. Use another shift register with the number of valid elements in it.
You make a copy of your array data every time you add an element. Do you really need to do this? It appears from your code that you just need the data once, when all the arrays are finished. Copies may or may not be a problem, depending on your array size. If I remember correctly, your array sizes are small, so it should not be too much of an issue.