For the benefit of anyone else struggling ith the same issue who come across this thread, I have done a little more research and identified two seperate issues which I needed to resolve in order to get partial caching working as I expected.
1) The cache block parser considers <% base_tag %> to be an open control block (even though it has no closing block) therefore if nest <% base_tag %> within a <% cache %> block then any additional nested <% cache %> or <% uncached %> blocks will return errors. The solution is either A) Never wrap <% base_tag %> in a <% cache %> block B) Continue to include the <% base_tag %> within a larger <% cache %> block BUT ensure it is directly wrapped in an <% uncached %> block C) If you still want to cache the <base> tag then do not use <% base_tag %> but instead use you own markup i.e.
<base href="{$Director.absoluteBaseURL()}"><!--[if lte IE 6]></base><![endif]-->
2) Nested <% cache %> blocks, with higher specificity, within <% include %> (or $Layout) will no be honoured. <% include %> (and $Layout) blocks are parsed/rendered using a new instance of SS_Viewer which has no knowledge of the existing SS_Vierwer instance (i.e. the one being used to parse/render Page.ss) and therefore, no knowledge of the fact it is within a parent <% cache %> block. The solution is to wrap all of you <% include %> blocks in <% uncached %> and then resume your caching within the <% include %> itself. This will not work:
templates/Page.ss
<% cached 'Page', $getPageCacheKey() if $useCache() %>
<body>
<h1>My Page</h1>
<% include Header %>
</body>
<% end_cached %>
templates/Includes/Header.ss
<header>
<h2>$Subtitle</h2>
<div class="usp-bar">
<div class="container">
<div class="row">
<% cached 'Header', $gerMoreSpecificCacheKey() if $useCache() %>
<div class="col-sm-4"><p>$someMethodA()</p></div>
<div class="col-sm-4"><p>$someMethodB()</p></div>
<div class="col-sm-4"><p>$someMethodC()</p></div>
<% end_cached %>
</div>
</div>
</div>
</header>
As the cache key in Header.ss with higher specificity than the generic cache key in Page.ss will not be honoured and the Header.ss cache block will become stale. However this will work:
templates/Page.ss
<% cached 'Page', $getPageCacheKey() if $useCache() %>
<body>
<h1>My Page</h1>
<% include Header %>
</body>
<% end_cached %>
templates/Includes/Header.ss
<% cached 'Page', $getPageCacheKey() if $useCache() %>
<header>
<h2>$Subtitle</h2>
<div class="usp-bar">
<div class="container">
<div class="row">
<% cached 'Header', $gerMoreSpecificCacheKey() if $useCache() %>
<div class="col-sm-4"><p>$someMethodA()</p></div>
<div class="col-sm-4"><p>$someMethodB()</p></div>
<div class="col-sm-4"><p>$someMethodC()</p></div>
<% end_cached %>
</div>
</div>
</div>
</header>
<% end_cached %>