Well code in the ISR will be blocking by definition because the global interrupt flag is set when an interrupt happens. However inside the ISR that deals with a D/A Conversion complete interrupt, you can lower the global flag, and so any time timeout interrupts will still get through while you are doing stuff with your sample you just read.
Can you post the code of when you put the A/D into free running mode and it made no difference?