Firstly, I see no issue (in principle) with the first approach, the XML file. Easily editable, easily extendable.
Secondly, I would still recommend not using XML, and using JSON instead, since it's going to make the saving/loading of the stats significantly easier:
[System.Serializable]
public class TowerStats2
{
public TowerType type;
public int lvl;
public int damageLow;
public int damageHigh;
public float range;
public float attackFrequency;
}
And then instead of having to write annoying boilerplate to convert to/from XML, you can just do
var stats = JsonUtility.FromJSON<TowerStats2>(jsonString);
string jsonStats = JsonUtility.ToJson(stats);
And if you ever add new attributes, it'll still work.
Thirdly, if the XML files are inside the unity Assets folder, meaning to modify them, you need to actually open the project in unity, meaning your designer needs to have unity editor and work within it anyway...
...you might want to look into [ScriptableObject][1], which is basically... A C# class that the unity uses as a prescription for a data storage file, which you can then create in your project as an asset.
How that works in principle is that you can create assets (data files) equivalent to the XML/JSON ones you'd use, except all of the deserialization is automatically handled by unity, you can edit the data in them via inspector, and you can also readily plug them into C# code, assign them into fields in Inspector, all the good standard Unity Editor stuff, so now the workflow for your designer is literally the same as doing anything else within unity editor. So if there's no need for the files to be external to the project (meaning they would be besides the compiled data, still accessible and editable even within the built game), this would be probably the easiest and "most native to Unity" way to do it.
[1]: https://docs.unity3d.com/Manual/class-ScriptableObject.html