It is possible to duplicate workeffort in the WorkEffort component (https://localhost:8443/workeffort/control/EditWorkEffort?workEffortId=9000) but the duplicated WorkEffort keeps the same status than the original one. So when you duplicate a cancelled task, it is locked in the same state.
We could adapt this service to allow the selection of the status for the new workeffort. Of course, you should be able to select only status that are relevant to the workeffort type.
A first solution is to get the currentStatusId of the workeffort to duplicate. Then we can access to the linked statusTypeId. So we can retrieve all status relevant and order them by sequenceId (that way the default value is the first statuts of the sequence : created for the task).