Il sizeof operator fa parte delle specifiche del linguaggio C (e C++) ed è implementato all'interno del compilatore (il front-end). Non c'è modo di implementarlo con altri costrutti C (a meno che non si utilizzino estensioni GCC come typeof) perché può accettare tipi o espressioni come operando, senza creare alcun effetto collaterale (ad es. sizeof((i>1)?i:(1/i)) non andrà in crash quando i==0 ma la tua macro my_sizeof andrebbe in crash con una divisione per zero). Vedi anche le linee guida per la codifica in C e wikipedia.
Dovresti capire l'aritmetica del puntatore C. Vedi ad es. questa domanda. La differenza del puntatore è espressa in elementi non in byte.
Il risultato della sottrazione del puntatore è in elementi e non in byte. Quindi la prima espressione restituisce 1 per definizione.
A parte questo, dovresti davvero usare le parentesi nelle macro:
#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)
Altrimenti tentando di usare my_sizeof() in un'espressione può portare a errori.