It really depends on the details of Array1D and Array2D. Here's what could make it important to return a copy (rather than a reference).
Suppose that Array1D (let's call these Rows) is just a pair of a pointer to the data, and the integer representing the size of the data. Copying that pair is not a problem (just as fast as returning a reference). Now, suppose that Array2D (let's call it Table) holds those Rows (light-weight pairs) in a vector. Returning a reference to a Row in effect returns a pointer to an element in the Table vector. If you save that reference, and then add more Rows, the vector may get reallocated and your reference would no longer be valid. But the data inside the Rows didn't move, so if you had a copy of that Row (pointer plus size), you could still safely access it.
On the other hand, if Array1D is a vector, for example, with an expensive copy, then returning it by value seems a distinctly bad idea.
Lastly, whoever wrote that code, assuming that return by value was intentional, should have added a comment to explain it :)