You can program PICs to program their own program memory. That is what bootloaders do.
On some PICs, such as pic18F24J10, the only EEPROM is the program memory.
I wasn't actually programming the program space. I was writing to the data EEPROM. That has a larger endurance, but it is still only 1,000,000 or so.
My code wrote to a couple of locations as fast as possible, so about every 2 ms, or 4ms for two locations. That is 250 times per second, so 1,000,000 in 4000 seconds, or about an hour.
My code was faulty. I was trying to get it to write only when the data wasn't correct, but that obviously didn't work. I changed it to write when the data was new.