Очевидно, что для выполнения Serial.println эта ерундовина тоже использует прерывания -так она подгружает в порт очередной символ после отправки предыдущего.
Как только речь идет об использовании риалтайма, первое, что надо сделать - выкинуть ардуинскую среду к чертовой матери и поставить AVR_Studio.
Там есть нормальный, не заваленный барахлом для начинающих, компилятор GCC и нормальные, не таскающие за собой C++, библиотеки.
Затем, нужно разобраться с таким явлением как прерывания. В даташите на контроллер написано, как настроить АЦП на вызов прерывания по окончании очередного измерения, а также можно написать обработчик этого прерывания на ассемблере. Тогда и функция подсчета числа миллисекунд вам будет не нужна, потому что время выполнения программы вам будет точно известно - его можно посчитать по количеству тактов на измерение АЦП (см. даташит) и количеству инструкций в обработчике прерывания (см даташит еще раз, большинство инструкций контроллер делает ровно за 1 такт). В обработчике нужно быстренько засунуть новый отсчет в массив и свалить.
Насколько я помню, максимальная частота съема, которую можно выжать из АЦП, около 32 кГц при тактировании контроллера от 20МГц