For small ML routines, the range of 673 .. 767 is a good choice. These locations are not used in any way by BASIC.
For slightly bigger routines, the tape buffer from 828 .. 1023 is also quite usable. It's however overwritten as soon as a tape operation is done, so it's more useful for floppy users.
You can change the limits of the RAM available to the BASIC interpreter, either 55/56 ('roof', top of RAM) or 43/44 ('base', bottom of RAM). The blocked memory ranges can then be used for own code, data and graphics (but see the remark to VIC below), without any concern they might be overwritten by BASIC because of the program, variable or string storage. It's quite easy to do the first method at the start of a BASIC program, provided other pointers are also reset, like in:
... which sets the top of RAM to 7168, exclusive. Changing the bottom of RAM is slightly more difficult, and there is no easy method to do it as soon as there's already a BASIC program loaded (even more so, when it's already running and variables have been allocated), as this would require to shift the program in memory and adjust a lot of pointers within the tokenized program text and to the variable data. Rather one uses a boot loader, which first sets the new BASIC start and then loads the main BASIC program that runs from this position.
As a rough guide, lowering the roof is mostly done on an unexpanded VIC-20 or with +3K RAM. Raising the BASIC start is usually preferable as soon as there's a +8K or a bigger RAM expansion required for the program.
When you use a BASIC stub, you're more or less free to arrange code and data as you wish. You should keep in mind though that besides the character ROM, VIC can only access the internal RAM ($0000 .. $03FF and $1000 .. $1FFF) for the text screen and user defined graphics.
For more information, please consult the VIC-20 Programmer's Reference Guide.