How to default checkboxes to checked while maintaining custom return value
Sorry for such a late response but it is possible, I ran into this same issue using 8.5.3 the below configuration worked for me.  You just have to use both together, i successfully passed numbers, text, bool (becomes 0 or 1), and arrays through #return_value.  The class was just for formatting, you can leave that out if you're not using it.

'checkbox_1' =&gt; [
    '#type' =&gt; 'checkbox',
    '#title' =&gt; t('Checkbox 1'),
    '#default_value' =&gt; 1,         // Default to checked
    '#return_value' =&gt; "checked",  // Return the value if checked
    '#attributes' =&gt; ['class'=&gt;['check_group']],
],
'checkbox_2' =&gt; [
    '#type' =&gt; 'checkbox',
    '#title' =&gt; t('Checkbox 2'),
    '#default_value' =&gt; 0,         // Default to unchecked
    '#return_value' =&gt; "checked",  // Return the value if checked
    '#attributes' =&gt; ['class'=&gt;['check_group']],
],


Output will look like this if you dpm($form_state->getValues()) in your submit or validate function.

Array
(
    [checkbox_1] =&gt; checked
    [checkbox_2] =&gt; 0
)