That is how I also understood it.
It looks like you have some misunderstandings:
I also created a flag system for the NMI to make sure that only one MainLoop sequence is processed during NMI.
WaitForNMI: ;Allow NMI to complete one pass before Starting Main Loop again. This ensure no game logic will happen during NMI while its writing.
This wait isn't to prevent the main loop to happen during NMI, the main loop can't happen during an NMI anyway. The NMI interrupts the main loop, not the other way around (NMI - Non-Maskable Interrupt - an interrupt that can't be ignored and will always happen when it's setup to, if I understood it correctly), and that means the main loop is paused and then the NMI handler runs. When it reaches the RTI instruction the main loop resumes from wherever it was when the NMI happened.
This wait ensures that there's not more than one main loop on one NMI. However it doesn't prevent that there are two or more NMIs on one main loop if the main loop takes too long (NMI, when enabled, always happens every 60th (or 50th for PAL) of a second no matter what). But that's what the frameready flag is for. Your main loop is probably so short now that you won't have that problem in Pong though.
STA $2003 ; set the low byte (00) of the RAM address
STA $4014 ; set the high byte (02) of the RAM address, start the transfer
The code here is correct but the comments here are wrong. They should say something along:
"ensure OAM address $00 is selected as destination start address for sprite DMA" and
"set the RAM page to be used as source address and start sprite DMA" respectively.
We just discussed this missunderstanding in another thread. You are not to blame though, Nerdy Nights is teaching this incorrectly.
This won't really change anything in your game but, I'd put SpriteDMA before DrawScore. The general rules I follow for a good NMI handler is:
1) Sprite updates (SpriteDMA)
2) Nametable updates (DrawScore)
3) Palette updates (you don't have any)
4) PPU setting updates ($2000 and $2001)
5) Scroll updates (two writes to $2005)
6) Sound routine update
7) Any other update you want to happen every frame at 60 Hz (or 50 Hz for PAL) but doesn't need to be in vblank
Note: 1 to 5 are graphic updates and needs to finish before the vblank period is over so they can't take too much time. For 6 and 7 it doesn't matter if vblank is over.
Sprite DMA needs to happen early on PAL so it's standard practice to do it first. That's what comercial games generally do.
Nametable and palette updates can be done in any order but they should come right after sprite udpates because they still need to be done within the vblank period. You don't change palettes in your game, but it's good to remember in the future.
Scroll always needs to be done last among the graphic updates (due to the other PPU register writes messes up the scroll coordinates for some reason), but still within vblank. Since your game is single screen you write 0 to it every NMI so it doesn't move around.
Sound routine doesn't need to be in vblank, unlike the above graphic updates, so it's updated last in the NMI when there's a risk that vblank period is over (but the NMI isn't over yet). I guess you are not doing sound yet, but in the future...