Have you tried calling a subroutine from the ISR which itself calls more subroutines? You may be "on the edge" of available stack space, and with each subroutine call you use up a little stack. digitalWrite() does call a sub-sub-routine so you may have a crashed stack that you don't see if you only call a "simple" subroutine that calls nothing else.
Well not enough of a code guy to help you dig down, but the 'rule of thump' when creating ISR routines is to keep them as short and simple as possible as all interrupts are disabled while a ISR is active. This can effect timing of other running I/O routines, etc.
Set/reset global flags while in the ISR that the main loop of the sketch can deal with. Calling functions within a ISR is just asking for problems.