Один способ, которым я понял, как сделать это так, чтобы он был и быстрым, и потокобезопасным, был следующим:
var imgBytes = value as byte[];
if (imgBytes == null)
return null;
using (var stream = new MemoryStream(imgBytes))
return BitmapFrame.Create(stream,BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
Я бросил это в конвертер для моего приложения WPF после запуска изображений как Varbinary из БД.