Dabei ist es egal ob das im Timer, oder als Thread ausgeführt wird.
Ich vermute, hier liegt der Knackpunkt.
IcmpSendEcho kehrt erst zurück, wenn eine Antwort oder eine Timeout eingetreten ist. Folglich wird also natürlich der jeweilige Thread des laufenden Programms unterbrochen, bis dieser Fall eingetreten ist. Ein Timer gehört zum Hauptthread und unterbricht somit auch die
GUI.
Solltest du allerdings einen eigenen Thread für den Ping verwenden, so wird nur dieser unterbrochen und alle anderen Threads des Programms laufen wie gehabt weiter. Ist das bei dir nicht der Fall, gehe ich stark davon aus, dass du einen Fehler in der Threadimplementierung hast.