You can never be sure, but you can use heuristics to make an educated guess. Are you only talking about single post pages, or also lists? Some widgets also list post titles, I assume you don't care about sidebars?
Also, you do not know whether it is the title that is written in <h1> tags. If you see <h1>{$title}</h1>, is it the post title or the site name, or something completely else?
I would simplify the question to this: does the current main template file (that is included by template-loader.php) contain <h1>[some stuff]title[some stuff]</h1>? This would cover <h1>{$title}</h1>, <h1><?php the_title(); ?></h1> and other common patterns. It would probably get fooled by commented parts, like <!-- <h1>{$title}</h1> -->. It does not cover get_template_part() includes, maybe you can add that yourself (but there is no easy hook for that). Watch out for <h1>Site name</h1> [content] <h2>Post title</h2> [content] <h1>Some other big heading</h1>, you don't want to match that.
The general idea would be to hook (late) into the template_include filter, so you know which template file will be included. Analyze this file, looking for the pattern above. If you find it, set a variable that was null to true. If you can't find it, set it to false. Cache the result, since this will probably be an expensive operation and the template doesn't change that often.
You won't know the result until the template will be included, but I assume you will change the output of the_title() based on the result? In that case, you don't need to know it that early.
<h1>{$title}</h1>and some of them not. And what is your plugin trying to do? More use-case details would help us help you answer this question. – MikeSchinkel♦ Nov 9 '10 at 7:54