Delta_G:
Let's say for instance that I had foolishly used the String library in a part of my code and corrupted the stack or the heap and locked up the program. When the watchdog goes off, will the ISR be able to run in that state?
Yes. As long as the processor has not melted into slag, and interrupts are enabled, the watchdog ISR will run.
And how would I ever be able to know that the variables weren't corrupted in the crash?
The variables are now shared with an interrupt service routine so multi-byte variables must be protected with a critical section (disable interrupts during access).
A CRC works fairly well for detecting unwanted changes.
An inverted copy of the data is faster than a CRC and works a bit better for detecting unwanted changes.
If the code is truly locked up and the ISR can't complete, will the reset still happen
That is my understanding from reading the datasheet. If you do not pet-the-dog, the second firing resets the processor. Even if the ISR has not yet been called.
Is there a piece of the approach that I am missing here?
Make certain the watchdog configuration / management leaves enough time to write the data to the EEPROM.
One last question... Is plopping a while(true){} somewhere in my code an acceptable way to simulate a hang in order to test the watchdog code?
Absolutely.
Or should I intentionally do something wrong (like with the String library) to simulate a real fault.
Use that technique to test your "is my data corrupt" code.