Achieving 32-bit timer resolution
1) I don't understand why are they multiplying MSB by 65535 (see 3.1).


The appnote is wrong on that - not that unheard off.


  Shouldn't it be 65536 instead (assuming I use period of 65535)?


That part isn't clear. If the lower (16 bit) timer rolls over from 65535 to 0, its period of 65536.

If it rolls over at a number less than 65535 ( via auto reloading for example) the math is slight more different but the concept is the same. 

Btw, using pointers to a union will greatly improve the execution.

The basic concept can be used to great synthetic timers with really long overflow periods.