Image field causes #access to reset to default
I would try refactoring your code, so that the part that produces the value of $is_younger first checks whether the triggering element is the field_dob field.

As an example:

// some other stuff here
$dob_date_combo_element = &amp;$form['field_dob']['und'][0];
$dob_date_combo_element['#ajax'] = [
  'callback' =&gt; 'mrpeanut_form_record_node_form_minor_agreement_callback',
  'wrapper' =&gt; 'minor-ajax',
  'effect' =&gt; 'fade',
];

// Were we called by the #ajax-ified element?
if (isset($form_state['triggering_element']) &amp;&amp; 
  $form_state['triggering_element']['#name'] === 'field_dob[und][0][value]') {
  $values = !empty($form_state['values']) ? $form_state['values'] : array();
  $is_younger = TRUE;

  if (!empty($values['field_dob']['und'][0]['value'])) {
      $dob = new DateTime($values['field_dob']['und'][0]['value']);
      $now = new DateTime();
      $age = $now-&gt;diff($dob)-&gt;y;
      $is_younger = $age &lt; 18;
  }
  $form['field_minor_agreement']['und']['#access'] = $is_younger;
}
// Initial form loading.
else if (empty($form_state['input']) {
  // Place initial loading logic here for field_minor_agreement.
}