Adding an array to your block doesn't get you anywhere. Think in terms of behavior, not about data structures.
I guess your teacher did provide you with the overall idea: given a row and column, answer the associated value; otherwise ask the "tail" for the answer.
That is literally how you would implement it in Smalltalk using a block closure (where the "tail" is the previously set block). Inside the block, put code that does the testing and answering and tail recursion. Do not make a data structure, tail and head are just metaphors to reason about this style of coding.
I just implemented your LazyMatrix in Squeak, it is just a few lines of code. Cute example, indeed. And no arrays or collections involved, at all.
Hint: The key to this puzzle is realizing that every call to setRow:column:value: can create a new block, which is independent of all the previously created blocks.