Now that I've had three hours of sleep, let me see if I can convey my thoughts a little clearer.
In regards to the RETFIE instruction, all it does is GIE=1 and set PC to its prior value. So embedding the RETFIE instruction is not really going to help matters.
What I believe is happening, I take a more thorough look at your code shortly, is that an interrupt you were not expecting is triggered, calling your ISR which is not prepared to handle this unexpected interrupt. Because it is not prepared for this particular interrupt, it doesn't reset its interrupt flag. Therefore, once the ISR is exited and the GIE is again set, BINGO you're right back in the ISR again and the vicious cycle starts all over again.
If you can debug your program, set a breakpoint inside the ISR. Then run the program and when you hit the breakpoint, check all the interrupt flags to determine which interrupt is calling the ISR.
Also, you could and should disable any maskable interrupts you do not intend to service. I'll check your program shortly and let you know what else I find.