Is it possible to create a post using a metabox?

Update

The answer is so simple, I couldn’t see it at first. 🙂

Just remove the action during the first function call. This way, your work within the API, and your function is really called just once. No need for static or even global variables or constants.

function my_metabox_save() {
    remove_action( 'save_post', 'my_metabox_save' );
    // go on with your function ...

I’ll leave the old answer to illustrate how awkward a solution may get if you think too abstract …

Old answer

Add a check to my_metabox_save() to prevent a second call.

Sample code (not tested):

function my_metabox_save() {
    static $done = FALSE;
    if ( $done )
    { // No, not again!
        return;
    }
    //data authenticity check
    //process & sanitize data

    //create posts
    for( $i=0; $i<$count; $i++ ) {
        $args = array(
            'post_status' => 'pending',
            'post_title'  => $_POST['post_title'][$i],
            'post_type'   => 'custom_post_type',
        );
        foreach( $category_array[$i] as $category ) {
            $args['tax_input']['custom-taxonomy'][] = $category;
        }
        if( $_POST['id_of_previously_created_post'][$i] != '' ) {
            $args['ID'] = $_POST['id_of_previously_created_post'][$i];
            unset( $args['post_status'] );
        }
        $new_post_id = wp_insert_post( $args );
    }
    $done = TRUE; // Remember that we’re done.
}