Try this. Yours took 486 ms and I got it down to 30 ms.
#include <Array.au3>
Dim $aTmp[1000][2]
;Fill array with junk
For $X = 0 to 999
;Insert empty element every 10 nodes, fill the rest with junk
If Mod($X,10) = 0 Then
$aTmp[$X][0] = ""
$aTmp[$X][1] = ""
Else
$aTmp[$X][0] = "ebgrhrrtbnwrbnwfg"
$aTmp[$X][1] = "bwefwergethcbrtgh"
EndIf
Next
_ArrayDisplay($aTmp, "$aTmp_BEFORE")
$T1 = TimerInit()
;_Array2DDeleteEmptyRows($aTmp)
$aTmp = _DeleteEmptyRows($aTmp)
ConsoleWrite("T1: " & TimerDiff($T1) & @CRLF)
_ArrayDisplay($aTmp, "$aTmp_AFTER")
;486 ms
Func _Array2DDeleteEmptyRows(ByRef $iArray)
Local $vEmpty = True
For $i = UBound($iArray) - 1 To 0 Step -1
For $j = 0 To UBound($iArray, 2)-1 Step 1
If $iArray[$i][$j] <> "" Then
$vEmpty = False
EndIf
Next
If $vEmpty = True Then _ArrayDelete($iArray, $i)
$vEmpty = True
Next
EndFunc
;30 ms
Func _DeleteEmptyRows($aArray)
Local $Rows = Ubound($aArray,1)
Local $Cols = Ubound($aArray,2)
Local $aTemp[$Rows][$Cols]
Local $not_empty
Local $Count = 0
;Loop through rows
For $Y = 0 to $Rows - 1
$not_empty = 0
;Loop through columns
For $X = 0 to $Cols - 1
;Copy all columns to temp array even if they are all empty
$aTemp[$Count][$X] = $aArray[$Y][$X]
;If even one column contains data, make sure it doesn't get deleted
If $aArray[$Y][$X] <> "" Then $not_empty = BitOr($not_empty, 1)
Next
;If the row has any data, increment, else keep overwriting last row until it contains something
If $not_empty Then $Count += 1
Next
Redim $aTemp[$Count][$Cols]
Return $aTemp
EndFunc