There are ways to handle it without reassembly, like writing
location-independent 6502 code (not bad for short non-self-modifying
routines), but they can cost speed, which is a problem.
Actually, Apple once made an effort to use the "R" file type in Apple
DOS, for relocatable 6502 object code. That code was not executable
though until it had ben processed by a linker.
There was even a third-party Linker utility, which could be used with
any Apple II assembler. Linker required you to follow specific
conventions in your assembly code, to mark and name entry points,
calls to external routines, and to mark blocks of code, relocatable
data, and non-relocatable data. You could then build a library of
routines, where each routine resided in its own binary file. Linker
linked it all together into one signle binary file, and could relocate
library modules but only by even multiples of 256 bytes.