Статика не имеет никакого отношения, когда код считается поточно-ориентированным или нет.Только статический означает, что метод и его данные не реплицируются во всех экземплярах классов.Вы должны попытаться представить, что произойдет с вашим кодом, если второй поток войдет в то время, когда первый поток все еще занят.Спросите себя, что происходит с данными в ваших локальных переменных, когда вы заняты работой с ними.
Предположим, что поток 1 введет ваш метод, он устанавливает значение строки hex в пустое в строке 3 вашего образца.Затем он переходит к циклу for.Пока поток 1 все еще находится в цикле for, поток 2 входит и устанавливает значение шестнадцатеричной строки обратно пустым.Не хорошо, сэр!
Этот код не является потокобезопасным.Вы должны просто использовать ключевое слово lock против некоторого частного статического объекта.
Пример здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement