To achieve destroyable terrain trees there is a little trick. You have to use trees without colliders and then create colliders dynamically from editor or at the start of runtime.
Following solution creates object with collider for every tree at the start of runtime. Every object collider has a index reference to the treeInstances array from TerrainData so when you his this object’s collider you are able to locate terrain tree instance.
Created collider has same size of every kind of tree but this can be customized and branched based on tree prefab that can be accessed through terrain.treePrototypes[treeInstance.prototypeIndex].prefab.
Attach TreeTerrain.cs script to your terrain.
And this script is dynamically attached to created objects with collider from TreeTerrain.cs script above.
For example the flying fireball with trigger collider that would be able to destroy terrain tree can look like this.
More flexible and general approach would be to create some interface (eg. IHittable or IDestroyable or IDamagable) with methods like Hit or Destroy. Terrain tree and other damagable objects would implement this interface and then Fireball class could look like this.
Using approach described in this post you don’t need to call TerrainData.SetHeights to destroy colliders from removed trees so you will avoid some performance issues.