Se il limite è imposto dal sistema operativo, nel creare un eseguibile per quel sistema operativo il C++ non può farci nulla, e neppure l'assembly.
Quando il sistema operativo carica l'eseguibile da disco, crea una sua immagine nella memoria virtuale dove saranno organizzate le variabili inizializzate, quelle non inizializzate e il codice operativo per il processore. Tutte queste informazioni debbono essere raggiunte dal processore mediante un puntatore. Che io sappia Windows (ma anche UNIX) gestisce la memoria virtuale puntando al byte e non al singolo bit.
Sia che si tratti di un puntatore a 32 bit che un puntatore a 64 bit, ogni incremento di uno provoca lo spostamento al byte sucessivo sulla memoria.
Se un puntatore fosse capace di puntare al singolo bit, sarebbe molto minore la memoria raggiungibile e dunque allocabile dal sistema.