AnalogRead() takes about 110 micros() on a UNO. During this time the call is blocking and only interrupts can be served.
As I did not like that I did an experiment to check if analogRead() can be split in 3 functions:
void AR_Start(uint8_t pin); // starting the conversion
bool AR_Ready(); // checking if conversion is done
int AR_Value()); // reading the value
Find below a first experiment in which I broke up the code of analogRead() in these 3 steps (removed some lines) and it seems to work. (using a floating line).
output: (count++, micros, value) except for 1st 2 lines
start:
398
248 112 386
231 104 339
240 108 312
233 104 293
232 104 280
247 112 273
241 108 275
234 108 291
233 104 310
234 112 338
240 108 355
233 108 362
The output indicates that it takes 100++ micros() to do the analogRead(), so there is quite some time to do some computing between starting the analogRead() and reading its value. In that time I can:
- increment an int 200+ times
- do digitalWrite 20+ times
- etc
The nice part is that in theory I can start an new analogRead directly after reading its value so the new value is (almost) ready when I need it - OK the reading might become outdated or other effects may arise, to be investigated.
(The highly experimental code - all disclaimers apply

//
// FILE: asyncAnalogRead.pde
// AUTHOR: Rob Tillaart
// DATE: 09-jun-2012
//
// PUPROSE: experimental
//
void setup()
{
Serial.begin(115200);
Serial.println("start: ");
Serial.println(analogRead(0)); // traditional
}
void loop()
{
unsigned long start=0;
unsigned long duration = 0;
int count=0;
AR_Start(0);
start = micros();
while(!AR_Ready())
{
count++; // dummy behaviour
}
duration = micros() - start;
Serial.print(count);
Serial.print("\t");
Serial.print(duration);
Serial.print("\t");
Serial.print(AR_Value());
Serial.println();
delay(200);
}
#include "wiring_private.h"
#include "pins_arduino.h"
// uint8_t analog_reference = DEFAULT;
void AR_Start(uint8_t pin)
{
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#else
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif
#if defined(ADCSRB) && defined(MUX5)
// the MUX5 bit of ADCSRB selects whether we're reading from channels
// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
// set the analog reference (high two bits of ADMUX) and select the
// channel (low 4 bits). this also sets ADLAR (left-adjust result)
// to 0 (the default).
#if defined(ADMUX)
ADMUX = (DEFAULT << 6) | (pin & 0x07);
#endif
// without a delay, we seem to read from the wrong channel
//delay(1);
sbi(ADCSRA, ADSC);
}
boolean AR_Ready()
{
// ADSC is cleared when the conversion finishes
return bit_is_set(ADCSRA, ADSC)==0;
}
int AR_Value()
{
// we have to read ADCL first; doing so locks both ADCL
// and ADCH until ADCH is read. reading ADCL second would
// cause the results of each conversion to be discarded,
// as ADCL and ADCH would be locked when it completed.
int low = ADCL;
int high = ADCH;
// combine the two bytes
return (high << 8) | low;
}