Если совсем кратко, то в первом случае функция выполняет только console.log(sum) и ничего другого. В случае return sum эту самую sum можно будет использовать как душе угодно
во втором случае ты можешь сделать так var a = calc(4,5) и в переменную "а" запишется то значение, которое из себя вернула функция. Ну и дальше с этой переменной "а" ты можешь делать что угодно. Т. е. ты ВЕРНУЛ результат работы функции в переменную. А в случае с первой функцией.. ну ты просто вывел результат на консоль. Он нигде больше не сохранился. Ты его только визуально увидел. Ты не можешь взять этот результат и, к примеру, умножить ещё на 2.
первый вариант функции не является чистым. Он как минимум имеет один побочный эффект - вывод на экран. Но кто сказал что вам всегда нужно будет выводить на экран? В большинстве случаев результат функции скрытно от пользователя используется в другой функции. Return - это возврат значения из функции. Причем на самом деле иногда он применяется и для других целях - в функциях асинхронной обработки он может быть использован для перрывания основного кода функции. при этом возврат значения совсем даже и не предусматривается.