You can do this without any dummy units or spells. Use this script:
-
Custom script: call UnitRemoveAbility(u, 'AAtk')
When duration ends, regain the attack ability:
-
Custom script: call UnitAddAbility(u, 'AAtk')
So far, I can't spot any disadvantage out of it.
I suggest you to make this a bit more elegant: user don't need to re-create dummy units everytime they want to disarm. How?
-
Then - Actions
-

Set DS_X = (DS_X + 1)
-

Set DS_Unit1[DS_X] = Disarm_Caster
-

Set DS_Unit2[DS_X] = Disarm_Target
-

-------- The Disarm Boolean. True = stacking, False = no stacking --------
-

-------- Create the dummy unit and cast the disarm --------
-

Unit - Create 1 Disarm_Dummy for (Owner of DS_Unit1[DS_X]) at (Position of DS_Unit2[DS_X]) facing Default building facing degrees
-

Set DS_Dummy[DS_X] = (Last created unit)
-

Unit - Add Disarm_DummySpell to DS_Dummy[DS_X]
-

Unit - Add a 1.00 second Generic expiration timer to DS_Dummy[DS_X]
-

Unit - Order DS_Dummy[DS_X] to Neutral Dark Ranger - Silence (Position of DS_Unit2[DS_X])
-

-------- Duration of Disarm --------
-

Set DS_Duration[DS_X] = Disarm_Duration
-

Set DS_DurationCurrent[DS_X] = Disarm_DurationCurrent
-

-------- Start the Loop --------
-

If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-


If - Conditions
-


Then - Actions
-



Trigger - Turn on Disarm Timer <gen>
-


Else - Actions
Move the whole block to another trigger (this is going to be your
disarm trigger). Then create another
non-array variables. This is just an example how user can disarm a unit:
-
set "duration" = 3.00
-
set "target" = (Attacked unit)
-
Custom script: call TriggerEvaluate(your disarm trigger)
Everytime user evaluates your trigger, a new instance of disarm is created, DS_Duration will inherits variable "duration" and DS_Unit (or the target) will inherits variable "target". Using this way, you just need one dummy caster for the whole game (created at map init), and neat and more convincing.
Hope you understand. However, you also missed some:
- (Position of (....)) leaks
- DS_Unit1 is unneeded
- You can only use one "duration" variable. Substract it by 0.03, when reaches 0 => recycle your variables
- Your periodical trigger is not based on variable Disarm_Loop