How to exlude posts that have certain meta_value?

WordPress 3.5 and up supports EXISTS and NOT EXISTS comparison operators.

compare (string) – Operator to test. Possible values are ‘=’, ‘!=’,
‘>’, ‘>=’, ‘<‘, ‘<=’, ‘LIKE’, ‘NOT LIKE’, ‘IN’, ‘NOT IN’, ‘BETWEEN’,
‘NOT BETWEEN’, ‘EXISTS’ (only in WP >= 3.5), and ‘NOT EXISTS’ (also
only in WP >= 3.5). Default value is ‘=’.

http://codex.wordpress.org/Class_Reference/WP_Query

So…

array(
    'key' => 'show_on_home',
    'compare' => 'NOT EXISTS'
)

… should show all posts that don’t have that key. I think that is what you are trying to do.