Por lo que veo la variable CBitmap es local al método en el que lo cargas, por lo que cuando salga de ámbito será destruida y el bitmap (que se asocia con el handle del CBitmap, no se copia), apuntará a cualquier lado. El bitmap ha de ser una variable miembro del diálogo. Ésta permanece pintada hasta que el botón se invalida y cuando tira a pintarse a sí mismo, el bitmap ya no está.
Otra cosa, cuando asignes el bitmap al botón, debes hacerlo mediante la llamada GetSafeHandle() del propio bitmap.
Por otro lado, podrías usas CBitmapButton, y especificar tres bitmpas diferentes, uno para el botón normal, otro para cuando esté presionado y uno más para cuando esté deshabilitado.