Only one message can execute at a time on the UI thread, which is where this code is running. Data-binding happens at a specific priority in separate messages, so you'll need to ensure that this code:
object test = c.Content;
runs after those data binding messages are executed. You can do this by queuing a separate message with the same level of priority (or lower) as data binding:
var c = new ContentControl();
c.SetBinding(ContentControl.ContentProperty, new Binding());
c.DataContext = "Test";
// this will execute after all other messages of higher priority have executed, and after already queued messages of the same priority have been executed
Dispatcher.BeginInvoke((ThreadStart)delegate
{
object test = c.Content;
}, System.Windows.Threading.DispatcherPriority.DataBind);
HTH,
Kent