(FAST6191 lived up to his name and beat me to the punch, but I'll give my reply anyway. ^^)
My usual approach is just to use the ASM sledgehammer.
Take a look at RAM to see if you can spot the page used for OAM data. It will be exactly $100 bytes, and the entire block of it will [usually] be "rolling". Most games either put it at the $0200 page or the $0700 page. And large blocks of it will probably have $F8 or $FF every 4th byte.
If you are unsure or are unable to spot it visually, you can put a write breakpoint on $4014. The game is likely writing that reg every frame, and the value written is the OAM data page number. IE: if the game is writing $02, then the OAM data is the $0200 page.
Then just put write breakpoints on bytes to that range and back-trace the code from there. Note that games generally do not modify the actual OAM in the PPU directly so watching the real OAM in the PPU won't do you much good. They will modify that $0200/$0700 page in RAM, and then the $4014 write copies the entire page to OAM in one big chunk.
Each sprite has 4 bytes of data: Y position, tile graphic to use, flags/attributes, and X position. Details can be found here:https://wiki.nesdev.com/w/index.php/PPU_OAM
Depending on the game, it might be a laborious process, but it will always eventually get you there.