Redirect posts to sub domain except pages

I would do this per server configuration. Here is an example for the .htaccess:

RewriteCond %{HTTP_HOST} !^blog\.example\.com$
RewriteRule (.*)\.html$ http://blog.example.com/$1.html [L,R=301]

You could do this in a WordPress plugin too. Untested suggestion:

add_action( 'template_redirect', 'wpse_77279_redirect' );

function wpse_77279_redirect()
{
    if ( is_single() 
        and 'blog.example.com' !== $_SERVER['HTTP_HOST'] 
        and 'post' === get_post_type() 
    )
    {
        wp_redirect( 'blog.example.com' . $_SERVER['REQUEST_URI'] );
        exit;
    }
}