Если известно, что число строк и столбцов кратно 3, то можно в функцию передавать по 3 строчки, создавать из них 3 квадрата и возвращать их, повторять до тех пор пока не закончите.
На практике лучше не вырезать квадраты, а передавать куда вам там надо изначальную матрицу и смещение в ней. Тогда не будет никаких лишних аллокаций памяти.
Но если вам так надо, заведите функцию, которая вырезает квадрат с заданными координатами и размерами (и в двух вложенных циклах по i и j от 0 до 2 запускайте ее от координат (3*i, 3*j).
Функция заводит массив нужного размера и для всех i,j копирует в ячейку [i,j] значение из большой матрицы из ячейки [i+offset_x, j+offset_y].
На самом деле эту задачу можно сделать очень разными способами. Деструктивными и нет. Экономными (массив) и неэкономными (зубчатый или двумерный массив). И автор должен конкретизировать как он хочет.