No and this is inherent to the memory access pattern (every value is multiple times to compute other values).
If you wanted to reduce the memory consumption, you could split it to smaller patches along the rows of a (or the columns of b) and overwrite blocks. In the extreme case you would allocate a buffer for a single row, perform the row-wise operation with matmul_out to that buffer and then copy the row to a.
Best regards
Thomas