Add element to form during (element) validation checks
Here's how I've got around this issue.

When defining the element, add in:


#pre_render 
#form_id
#element_validate


Here's the algorithm:


User completes normal form, entering something suspect.
The validation function picks up the suspect value and stores a note that this form (uses #form_id) and element has a suspect value on a global variable. It also uses form_error() to inform the user of the problem.
The #pre_render function is called for the element. This function does not get the form object at all, which is why we specifically added #form_id to the element. Using this we can check the global variable for this form and see whether suspect data was found. It was, so add another form element in asking for confirmation. This element is not part of the Form API, so as well as the usual ('#type' =&gt; 'textfield' etc. we need to explicitly set '#name').
User confirms the data on the new form element and re-submits form.
The validation function notices the confirm data in $form_state['input'] (it won't be in values because this element is not part of the Form API's form) and compares it to the submitted value. It matches, so it does not call form_error().
Assuming no more errors, form submission continues.


I've also implemented a thing for storing the confirmed suspect value in a hidden field in case other fields fail verification, meaning the user only has to confirm the data once.

Use case

My specific use case is an email validator module. Beyond the drupal sytax check it can lookup DNS records and then conduct an SMTP conversation with a server to see if mail is accepted. Some of the SMTP errors can be temporary and so we use this chance to tell the user "hmmm. we got this error (user-friendly version of error goes here) - might be a temporary thing but can you double check your email?" allowing them to complete the form while still helping them avoid typos.

My email_validator module on github