What I read about OTA says that you load half of the memory with the new code and then switch over.
Isn't it possible to install a small loader in the bottom section. When you want to upload new code, switch to the loader and then use the loader to reload the upper section.
All the loader needs is enough to recognize the load request and switch when done.
This would free up a lot more memory for bigger programs.
but the loader can't be small. it uses the networking library, which takes the largest part on a small flash.
alternative to storige in flash is SD card
Two options are to have an API that is permanent, containing the network functions and such, with a smaller application that can be re-loaded, or alternatively to have an interpreter which can load an application - like FORTH.
For any given purpose, there should be no reason you would need to re-load the whole code - assuming you did it properly in the first place.