If you want efficiency, relying on "plain" arrays is undoubtedly the best option. The reason why they are so efficient with respect to other alternatives (Collections, List, etc.) is because they contain the minimum amount of information required. If you want fancy functions allowing to sort the information easily/quickly or write complex queries to retrieve data, you shouldn't rely on arrays.
I always rely on a code like the one you wrote and haven't ever had a speed problem (this is really fast). I have done a quick research to make sure that there is no other option, but couldn't find any. The closest thing you have is Array.Copy
, although it works just when the arrays have the same dimensions (I, personally, use it just with 1D arrays). In any case, I found an interesting link about Array.Copy() vs. loop performance for 2D arrays (it is in C# but everything is applicable to VB.NET).
Summary: your code is really fast and does not need to be improved. In case of having a valid alternative (Array.Copy working for 2D and 1D, what does not exist), the resulting performance would be just a bit better (and only for small array sizes).