Persist fields with Setting API

This a really good question – my suggestion is to use transients. For instance, in your validation callback:

 wpse51669_validation_cb($settings){
     //Perform validation checks

     if( $valid ){
        //If settings validate
        return $validate_settings;
     }

     //Otherwise add settings error
     add_settings_error('my-plug-in-settings','error-with-xyz', 'I fell over','error');

     //And add the failed settings to a transient
     set_transient( 'my-plug-in-settings-invalid', $settings, 60);

     return false;
 }

Then on your settings page, if the options have been validated – check for the transient, and use the ‘failed’ settings, if they are found:

    if( isset($_GET['settings-updated']) && $_GET['settings-updated'] && get_transient('my-plug-in-settings-invalid') ){
        $options_to_display  = get_transient('my-plug-in-settings-invalid');
        delete_transient('my-plug-in-settings-invalid');    

    }else{
        $options_to_display = get_option('my-plug-in-settings');
    }