I'd generally defer to the experts here. I haven't attempted to modify an NES ROM yet and I'm still myself learning about various cross assembler tools. I'm currently looking into tass64, for example. (You can read the manual for it here
But I did start out looking for a tool for SNES ROMs, some months back, and before knowing about this site in particular. So I was pretty ignorant, generally. I only knew that I wanted an assembler with ROM patching capability and it also had to run easily in Windows 10, provide source code that I could just drop into Visual Studio 2015, and where the source wasn't too ornery (it should be easy to read and modify.) What I found was a modern tool that emulated an old 1980's tool for the Apple computers. With a few modifications, it does the job simply and easily. I included some additional syntax so that it knows how a ROM may be formatted (for those cases where there is a memory mapper behind its use, for example.) But you probably only need one statement for that information on an NES. It directly modifies the ROM. It's an assembler and linker and patcher, built into one. (I probably will later modify it so that it emits patch files in various standard patching file formats. But for now, I just run the pre-modified ROM against the newly modified one to get that.)
In my case, I was setting up my son who is autistic and was working like you describe -- but using Lua code he wrote to either generate (data statements) or patch in hex code that he hand-assembled over a period of some months. I had tried over and over to get him to use an assembler tool, but just considering the idea is often a great difficulty -- it requires "newness" that makes it difficult. So I had to blaze the path a bit and create a tool that I knew he could easily use and apply right away, with the idea that getting the difficult bits out of the way would allow him to later focus more attention to assemblers and linkers, generally, after he got a serious running start here. So this tool was built up for that purpose -- to give him a very simple, one-stop tool that would read assembly code and generate a testable ROM as its output. That allowed him to just write assembly code and not have to think much about linking or patching tool issues. As he uses it more and more, those bits will become well-understood and I can then ween him off of the tool and towards more general purpose assembler + linker + patcher tool chains.
If you are interested in trying it out, I'd try and help as well. You can start at this page
. That page includes a completed example for modifying an existing SNES ROM (which needed two mapping statements to describe the ROM format.) But keep in mind that I haven't yet tried it on an NES ROM. It's just that in my ignorance here, I don't see why you couldn't use it for that purpose. It wants to assemble 65816 assembly statements, but if you stay with the 6502 source I think you should be okay. But again, I'm not certain. Finally, the assembly source format is matched up with the older Apple tool and may be somewhat different from other assemblers. It doesn't seem a lot different, but keep it in mind.
Source code is included and it just drops right into Visual Studio. I didn't provide all the project files, though. If you wanted them, I could offer them, but it's really pretty easy to just set up a project and include the source. It compiles straight away, without difficulties.