You need to tell the SparseArray how large it will be when you initialize it, then you can just use Part and Set to update it:
m = SparseArray[{1 -> 1}, {10}];
m[[3]] = 3
(* 3 *)
Head@m
(* SparseArray *)
Normal@m
(* {1, 0, 3, 0, 0, 0, 0, 0, 0, 0} *)
From the comments, I would suggest that an Association is a better data structure for this purpose. You can build it up efficiently, and quickly dump it to a SparseArray at the end,
data = <|1 -> 2|>;
(* do something *)
data[4] = 22;
(* do something else *)
data[233] = 55;
(* now that you are done, make a SparseArray *)
SparseArray[ Normal @ data]
(* SparseArray[Automatic, {233}, 0, {
1, {{0, 3}, {{1}, {4}, {233}}}, {2, 22, 55}}] *)
It will work for a higher dimension array,
data = <|{1, 1} -> 2|>;
data[{45, 33}] = 22;
data[{1000, 233}] = 55;
SparseArray[ Normal @ data]

You can access the stored values, and provide a default value just like for an array
Lookup[data, Key[{1000, 233}], 0]
(* 55 *)
Lookup[data, Key[{1000, 234}], 0]
(* 0 *)
SparseArrays entry-by-entry cannot be efficient. – Henrik Schumacher Jun 15 '18 at 18:13Association,AssociateTofor updating, andLookup(with a default of 0) for reading. – Szabolcs Jun 15 '18 at 18:26Association. I was misunderstandingSparseArraysemantics. – David G Jun 19 '18 at 21:01