Odio responder mi propia pregunta, pero en este caso creo que necesito hacerlo. Después de verificarlo, @Falmarri estaba en el camino correcto con su respuesta. El problema es que el control CheckBox de Android ya usa la propiedad android: paddingLeft para obtener el texto donde está.
La línea roja muestra el valor de desplazamiento paddingLeft de todo el CheckBox
Si acabo de anular ese relleno en mi diseño XML, arruina el diseño. Esto es lo que hace la configuración paddingLeft = "0":
Resulta que no puedes arreglar esto en XML. Lo tienes que hacer en código. Aquí está mi fragmento con un aumento de relleno codificado de 10dp.
final float scale = this.getResources().getDisplayMetrics().density;
checkBox.setPadding(checkBox.getPaddingLeft() + (int)(10.0f * scale + 0.5f),
checkBox.getPaddingTop(),
checkBox.getPaddingRight(),
checkBox.getPaddingBottom());
Esto le da lo siguiente, donde la línea verde es el aumento en el relleno. Esto es más seguro que codificar un valor, ya que diferentes dispositivos podrían usar diferentes elementos dibujables para la casilla de verificación.
ACTUALIZACIÓN: como la gente ha mencionado recientemente en las respuestas a continuación, este comportamiento aparentemente ha cambiado en Jelly Bean (4.2). Su aplicación deberá verificar en qué versión se está ejecutando y utilizar el método apropiado.
Para 4.3+ es simplemente establecer padding_left. Ver la respuesta de htafoya para más detalles.
TextView
condrawableLeft
y usardrawablePadding
para dar espacio al texto. En el código solo alterna los estados seleccionados y no seleccionados.