Dynamically excluding current page id

In your code, if $post_id were, say, 99, this:

query_posts("showposts=4&post_type=page&post_parent=168&orderby=rand&exclude=". $post_id ."");

would result in this being passed to query posts:

query_posts("showposts=4&post_type=page&post_parent=168&orderby=rand&exclude=". 99 ."");

so, your issue here is '. 99 .' isn’t a valid value for exclude.

That said, query_posts should only be used to alter the main loop in a template. if you want to do additional queries, you should create a new WP_Query instance.

$args = array(
    'post_type' => 'page',
    'posts_per_page' => 4,
    'post_parent' => 168,
    'orderby' => 'rand',
    'exclude' => $post_id
);

$related_posts = new WP_Query( $args );

while( $related_posts->have_posts() ):
    $related_posts->the_post();
    // loop stuff
endwhile;