This is not a permissions issue – contributors can (by default) change a post from pending to draft. To test, submit a post for review, then “quick edit” it – you’ll see that you’re able to change the status back to draft.
The issue is that the “save as draft” button in the UI is hidden once a post is submitted for review – let’s “restore” it:
function wpse_210259_revert_to_draft_button() {
global $post;
$post_type = get_post_type_object( $post->post_type );
if ( $post->post_status === 'pending' && ! current_user_can( $post_type->cap->publish_posts ) ) {
printf(
/**
* Since there are no hooks where the original "Save Draft" button
* appears, use CSS positioning to "fake" it to give the user a
* consistent UI.
*/
'<button style="position: absolute; top: 10px; left: 10px;" class="button" type="submit" name="post_status" value="draft">%s</button>',
__( 'Save as Draft' )
);
}
}
add_action( 'post_submitbox_misc_actions', 'wpse_210259_revert_to_draft_button' );