Sorry for making confuse. My answer is not correct. The issue here is TemplateBinding. TemplateBinding is a lightwight binding at compile time while using TemplatedParent happens at runtime, thus TemplateBinding has some limitation, one of which is it cannot bind to Freezables. What you can do is to use traditional templated parent instead:
<GradientStop Color="{Binding Path=BackgroundColor, RelativeSource={RelativeSource TemplatedParent}}" Offset="0" />
You can refer to http://blogs.msdn.com/b/liviuc/archive/2009/12/14/wpf-templatebinding-vs-relativesource-templatedparent.aspx
"You'd think the compiler or the runtime would throw some kind of error, but apparently not."
A good point. I did not see any binding error either in output window. However, I used Snoop to look into Color property and found exactly what I expected:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=BackgroundColor; DataItem=null; target element is 'GradientStop' (HashCode=4605357); target property is 'Color' (type 'Color')