Is there a way to define the $post var outside the loop?

I think setup_postdata($post) (internal) function does that. I failed to find proper documentation for it in Codex (typical), but there are examples with it here and there like in Displaying Posts Using a Custom Select Query.

This test snippet seems to work fine for example code you have in question:

foreach ( $cat1 as $post ) {

    setup_postdata($post);
    printf( 'Post "%s" was posted %s ago<br />',
        get_the_title(),
        human_time_diff( strtotime( get_the_date() ) )
        );
}