We had a similar issue that appears to be the same. Our problem only affected old services created prior to our deploying 20x. When we researched this issue weeks ago we found that pivotal and found and fixed it in a later release but I cannot seem to find the tracker issue ATM. An upgrade to latest CF version may fix you. An upgrade wasn't an option for us so we fixed our issue by modifying the CCDB. The fix for us was to create service_instance_operations rows for all of the services that didn't have one. We did so executing the following queries against our CCDB:
//This query will give you an idea of how many service instances your system has.
select count(*) from service_instances;
//This query will show you how many service_instance_operations you have. The difference of the two will tell you about how many service_instance_operations rows you need to insert.
select count(*) from service_instance_operations;
//This query will create a service_instance_operations entry for the next service_instance that doesn't have a service_instance_operations. You must execute this query for until every service_instance has a service_instance_operation. Once it stops updating rows you can stop.
insert into service_instance_operations (guid, updated_at, service_instance_id, type, state, description) select UUID(), NOW(), id, 'update', 'succeeded', '' from service_instances where id not in (select service_instance_id from service_instance_operations) limit 1;
//This resets the state of all the services stuck in "in progress"
update service_instance_operations set state='succeeded' where state='in progress';
//This gives all the operations a description other than null (not sure if this is necessary but it is what we did.
update service_instance_operations set description='' where description is null;
After doing all that our services were unstuck from being "in progress" and none of our services had this issue anymore.
Hope it helps.