Here is one way.
MODIFIED (see comment thread below)
showing two possible methods to fill the matrix by means of a for loop appoach. The second way is significantly faster, but both methods change the sparse matrix S as many times as you have blocks. For N blocks the overall time for the process appears to scale like N^2, so it's all right for a few hundred blocks. But when the numbers get large you will need to gin up some large index vectors and call sparse at most just a few times, preferably once as John has indicated.
The following may be useful.
From the [...] = ndgrid line in the code below, irow(:) is the row indices of the block itself (zero based). Then if m0vec is a column vector of N row indices for the upper left corner of the N blocks, and if you have a new enough version of Matlab
irowfull = irow(:) + m0vec';
irowfull = irowfull(:);
has the properties you want, similarly for column indices.
A = magic(4);
A(:,4) = ;
[Arow Acol] = size(A)
[irow icol] = ndgrid((0:Arow-1),(0:Acol-1))
s_row = 10; s_col = 10; n_s = 100;
S = spalloc(s_row, s_col,n_s)
m0 = 3; n0 = 5;
S = S + sparse(m0+irow(:),n0+icol(:),A(:),s_row,s_col)
S(m0:m0+Arow-1,n0:n0+Acol-1) = A