is a read/write from/to an uint8_t atomic?

Arithmetic is probably not atomic (eg. foo++);

Also be cautious of stuff like this:

if (foo > 100)
  foo = 0;

However a simple read would be OK.

I want the millis() etc. interrupts to go on.

If the whole things takes multiple milliseconds, can't you decode outside the ISR? Or do it another way? The IRremote library, for example, uses a timer interrupt to check (at a fixed interval) whether the incoming pulse is high or low.