digtialWrite does a "non-atomic" read-modify-write operation on the IO port containing the pin that you're writing:
read port
set or clear appropriate bit
write port
It's certainly POSSIBLE that an interrupt could occur after the port has been read but before it has been written, causing pin changes done within the interrupt routine to be "lost", though I wouldn't expect it to be terribly LIKELY (depending on how often you call digitalWrite in loop().)
While digitalWrite is perhaps 20 to 50 times slower than the fastest possible direct write, the latter is a single instruction, so digitalWrite isn't really THAT slow. You could just wrap the loop code in "turn off interrupt" instructions. It's not possible to maintain the ability of digitalWrite to use variables for pin number and value and still be atomic or very fast; if everything is constant, you could use direct writes in the loop() code.
I think DDR should be OK unless you're explicitly changing it back and forth in ISR and/or loop code.