For example Conditional Fields allows validation to pass for empty required fields that it has hidden, however date_repeat_field_widget_validate() will see these errors and consequent not build the repeat dates.

My fix is to only not build the repeat dates if date_repeat_field_widget_validate() generates a form error and ignore errors from other validation functions:

function date_repeat_field_widget_validate($element, &$form_state) {
  ...
  $errors = FALSE;
  if (!empty($item['rrule']) && $rrule_values['range_of_repeat'] === 'UNTIL' && empty($rrule_values['UNTIL']['datetime'])) {
    switch ($instance['widget']['type']) {
      case 'date_text':
      case 'date_popup':
        form_set_error($error_field_until . 'date', t("Missing value in 'Range of repeat'. (UNTIL).", array(), array('context' => 'Date repeat')));
        break;
      case 'date_select':
        form_set_error($error_field_until . 'year', t("Missing value in 'Range of repeat': Year (UNTIL)", array(), array('context' => 'Date repeat')));
        form_set_error($error_field_until . 'month', t("Missing value in 'Range of repeat': Month (UNTIL)", array(), array('context' => 'Date repeat')));
        form_set_error($error_field_until . 'day', t("Missing value in 'Range of repeat': Day (UNTIL)", array(), array('context' => 'Date repeat')));
        break;
    }
    $errors = TRUE;
  }

  $error_field_count = $error_field_base . '][rrule][count_child';
  if (!empty($item['rrule']) && $rrule_values['range_of_repeat'] === 'COUNT' && empty($rrule_values['COUNT'])) {
    form_set_error($error_field_count, t("Missing value in 'Range of repeat'. (COUNT).", array(), array('context' => 'Date repeat')));
    $errors = TRUE;
  }

  if ($errors) {
    return;
  }
  ...
}