Using `ArrayFlatten` with sparse zero-arrays should be quite efficient.

    extendSparseArray[A_SparseArray?MatrixQ, {m_, n_}] := Module[{mA, nA, b},
       {mA, nA} = Dimensions[A];
       b = A["Background"];
       ArrayFlatten[{
         {A, SparseArray[{}, {mA, n - nA}, b]},
         {SparseArray[{}, {m - mA, nA}, b], SparseArray[{}, {m - mA, n - nA}, b]}
         }]
       ];

Here a usage example:
    
    m2 = SparseArray[{{i_, i_} -> 1, {1, 2} -> a}, 2];

> $$ \left(
\begin{array}{cc}
 1 & a \\
 0 & 1 \\
\end{array}
\right)$$

    MatrixForm[extendSparseArray[m2, {3, 4}]]

> $$ \left( \begin{array}{cccc}  1 & a & 0 & 0 \\  0 & 1 & 0 & 0 \\  0 & 0 & 0 & 0 \\ \end{array} \right) $$


I also frequently use a function like following:

    quickSparseArray[rp_?VectorQ, ci_?MatrixQ, vals_?VectorQ, 
       dims_?VectorQ, background_ : 0] :=
      With[{data = {Automatic, dims, background, {1, {rp, ci}, vals}}},
       SparseArray @@ data
       ];

It allows you to construct the sparse matrix from its _compressed sparse row_ (CSR) data with minimal overhead. In particular, we have

    m2 == quickSparseArray[m2["RowPointers"], m2["ColumnIndices"], 
      m2["NonzeroValues"], m2["Dimensions"], m2["Background"]]

> True

The only thing needed to extend the matrix is to modify the vectors row pointers and to change the dimensions. More precisely, we have to append sufficiently many copies of the last entry to the row pointer vector:

    extendSparseArray2[A_SparseArray?MatrixQ, {m_, n_}] := 
      Module[{mA, nA, rp, rpnew},
        {mA, nA} = Dimensions[A];
        rp = A["RowPointers"];
        rpnew = Join[rp, ConstantArray[rp[[-1]], m - mA]];
        quickSparseArray[
          rpnew, A["ColumnIndices"], A["NonzeroValues"], {m, n}, A["Background"]
        ]
      ];

I have not tested this for performance, but the latter approach might be a bit faster with larger sparse matrices...


So far this was just about expansion by `0`. If you really want to build your matrix from blocks, then `ArrayFlatten` is your best friend, too.

    A = SparseArray[{{i_, i_} -> 1, {1, 2} -> a}, 2];
    B = SparseArray[{{i_, i_} -> 1, {1, 2} -> b}, 2];

    AB = ArrayFlatten[{{A,0},{0,B}}]

> $$
\left(
\begin{array}{cccc}
 1 & a & 0 & 0 \\
 0 & 1 & 0 & 0 \\
 0 & 0 & 1 & b \\
 0 & 0 & 0 & 1 \\
\end{array}
\right)
$$