adding a field to the form during form_validate
In form_validate(), make sure your arguments are being passed by reference:

myform_validate(&amp;$form, &amp;$form_state)


Then the last thing you should have in _validate() is:

$form_state['rebuild'] = TRUE;


Edit: You will want to handle the actual adding of the element in the form builder. This is tested and working:

function customform_custom_form($form, $form_state) {
  $form['field_a'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; 'Field A',
    '#required' =&gt; TRUE,
    '#weight' =&gt; 1,
  );      

  // Add field b depending on the value of field a.
  if (isset($form_state['input']) &amp;&amp; !empty($form_state['input']['field_a'])) {
    $form['field_b'] = array(
      '#type' =&gt; 'textfield',
      '#title' =&gt; 'Field B',
      '#weight' =&gt; 2,
    );
  }

  $form['submit'] = array(
    '#type' =&gt; 'submit',
    '#value' =&gt; 'Submit',
    '#weight' =&gt; 99,
  );

  return $form;
}

function customform_custom_form_validate(&amp;$form, &amp;$form_state) {
  if (empty($form_state['values']['field_b'])) {
    form_set_error('field_b', 'Please enter something in Field B.');
    $form_state['rebuild'] = TRUE;
  }
}

function customform_custom_form_submit(&amp;$form, &amp;$form_state) {
  drupal_set_message('You entered ' . $form_state['values']['field_b'] . ' for Field B.');
}