When removing a failed device, it's sometimes necessary to attempt communication with it first before calling RemoveFailedDevice. Try something like:
try
{
device.Level++;
}
catch
{
}
bool result = controller.RemoveFailedDevice(device);
The device.Level++ operation should time out and throw an exception. However, afterwards you should successfully be able to remove the failed device.
Let us know whether or not this helps.