Vale, según veo estás de suerte

. La clase TCheckBox sólo publica las propiedades, no implementa nada.
Según "las normas de creación de componentes", la clase TCustomCheckBox es la correcta para heredar de ella.
Código:
TcustomCheckBox
TXCustomCheckBox
TXCheckbox
Fíjate en TcustomCheckbox y TCheckBox, lo mismo debes hacer tú.
El TXCustomCheckBox es el que implementa todas las características y después TXCheckBox sería quien publica las propiedades en el inspector de objetos. De esta forma podrías incluir nuevas propiedades en el inspector de objeto e incluso ocultar algunas que tiene TCheckBox y que tú no quieras.
Me parece que el parpadeo viene porque usas
Código Delphi
[-]procedure CMDrawItem(var Message: TWMDrawItem); message WM_PAINT;
cuando veo que TWincontrol lo implementa así:
Código Delphi
[-] procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
No me cuadra que tú uses el mensaje TWMDrawItem y Borland use TWMPaint
Por otro lado, creo que aquí tienes algo más:
Código Delphi
[-]procedure TCustomCheckBox.SetState(Value: TCheckBoxState);
begin
if FState <> Value then
begin
FState := Value;
if HandleAllocated then
SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
if not ClicksDisabled then Click;
end;
end;
Cuando le das un clic al checkbox tuyo, primero se ejecuta ese código, que hará que se pinte al completo y supongo que después se ejecutará tu método Paint, de ahí el parpadeo.
SetState no lo puedes modificar porque es un método estático, pero CreateWnd y CreateParams sí lo puedes sobreescribir.
Creo que por ahí van los tiros, aunque habría que mirarlo mejor.
Saludos