Не знаю, что ты делаешь неправильно. Но это работает как шарм.
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (o, s) => { throw new Exception("myMessage"); };
bw.RunWorkerCompleted += (o, s) => { Console.WriteLine(s.Error.Message); };
bw.RunWorkerAsync();
Console.ReadKey(true);
Таким образом, это означает, что где-то ваше исключение должно быть перехвачено и, таким образом, не может распространяться на BWWorkCompletedEventArgs