<p>I have a bunch of controls on my window.  One of them is a refresh button that performs a cumbersome task on a background thread.</p>

<p>When the user clicks the refresh button, I put the cursor in a wait (hourglass) status and disable the whole window -- <code>Me.IsEnabled = False</code>.</p>

<p>I'd like to support cancellation of the refresh action by letting the user click a cancel button, but I can't facilitate this while the whole window is disabled.</p>

<p>Is there a way to do this besides disabling each control (except for the cancel button) one by one and then re-enabling them one by one when the user clicks cancel?</p>

You can data bind each controls IsEnabled property to your custom boolean dependency property that signals when your application is in lock down.  Just don't bind the cancel button.
As  Donnelle mentioned You can setup multi binding with a converter. Here are a couple examples you can refer to.
WPF MultiBinding with Converter
Implementing Parameterized MultiBinding Sample