Bosh tasks can technically be stopped/canceled, but the procedure does not always work. It's up to the executing task to honor the request. If the executing task does not get to a point where it would check if it needs to be canceled, then it won't stop.
Most of the time, what ends up happening is exactly what you are describing. You try to cancel a bosh task and it just hangs there forever saying that it's canceling.
To get the task to stop, you need to dig in and see what the task is doing. Usually the culprit is that one of the task's scripts is hung (drain scripts do this a lot in my experience). In some cases task scripts have a timeout, but some do not (see the bosh lifecycle docs for more details [1]). For the cases where there is no timeout, if that script hangs it will hang forever and cause the task to hang forever as well.
To resolve, you can SSH to the VM which is currently being worked on by the task (usually the `bosh task <num>` output will tell you) and see where it's stuck (`ps aux`, `monit summary` and check logs). You can often `kill -9` the task script and that will cause the task to resume. Once it resumes, the task should acknowledge your request to cancel and the task should stop.
Hope that helps!
[1] - https://bosh.io/docs/job-lifecycle/