Вероятно к этому месту в коде, переменные приходят не как 'char *', а, например, как 'const char *' - вы привели неполный кусок, точнее не скажешь. Если, например, arg1 и arg2 - глобальные переменные, объявленные в заголовочном файле (как можно понять из ваших слов, но это слишком дико, чтобы быть правдой), то такой ошибки быть не должно. Компилятор же говорит чёрным по белому, что такая инициализация отбрасывает квалификаторы у строк, на которые указывают arg1 и arg2. Как правило это именно присвоение переменной типа 'type *' значения типа 'const type *'.
Чем это опасно (в общем случае), думаю, и так понятно: потенциальной попыткой перезаписать константу. В результате: от изменения переменной там, где она меняться не должна, до Segmentation fault в случае, если сегмент памяти, в котором находится то, куда указывает указатель, является read-only.
Хотя в вашем случае, скорее всего ничего такого не произойдёт, так как после exec(3) никаких старых переменных уже не останется ***, а сами функции exec(3), по-моему, содержимое своих аргументов не меняют.
*** Надо помнить, что при провале exec(3) программа будет выполняться дальше. И даже если вы вставите сразу после exec(3) вызов exit(3) (что, вероятно, необходимо сделать), то перед выходом у вас могут быть вызваны функции, установленные, например, с помощью atexit(3). Хотя, повторяю, в случае с exec(3) всё это скорее всего не актуально, так как он, насколько я знаю, не пытается изменять свои аргументы, несмотря на такой странный прототип :).