how to not initialize variables

I'm not sure I understand the problem. The first example builds fine for me. So far as I can work out the object code looks about the way I would expect. I guess it does not do what you expect -- is that it? What actually happens to reset_counter across resets?

Disassembly of section .text.setup:

00000000 <setup>:
   0:   80 91 00 00     lds     r24, 0x0000
                        2: R_AVR_16     .noinit
   4:   8f 5f           subi    r24, 0xFF       ; 255
   6:   80 93 00 00     sts     0x0000, r24
                        8: R_AVR_16     .noinit
   a:   08 95           ret

Disassembly of section .text.loop:

00000000 <loop>:
   0:   08 95           ret

Disassembly of section .noinit:

00000000 <reset_counter>:
        ...

the ELF output looks about what I would expect:

Disassembly of section .bss:

00800200 <__bss_start>:
  800200:	00 00       	nop
	...

00800204 <timer0_millis>:
  800204:	00 00       	nop
	...

00800208 <timer0_fract>:
	...

Disassembly of section .noinit:

00800209 <reset_counter>:
	...

         :
         :

0000012c <setup>:
 12c:	80 91 09 02 	lds	r24, 0x0209
 130:	8f 5f       	subi	r24, 0xFF	; 255
 132:	80 93 09 02 	sts	0x0209, r24
 136:	08 95       	ret