Check if string is or can be made into a "valid string"
Your logic is fine. I think that a function of this sort does not necessarily need to be broken down into different functions. This function would still serve a single responsibility and without any wider need of such really specific functions in a wider application context, I see no reason to break it apart like this. 

I think what you have can be simplified to something like this:

function isValidString(str) {
    var strArray = str.split('');
    var counter = strArray.reduce(
        (cnt, letter) =&gt; { cnt[letter] = (cnt[letter] || 0) + 1; return cnt; }
        ,{}
    );
    var i = 0;
    var compareVal;
    var diffFound = false;
    for (letter in counter) {
        i++;        
        if (i === 1) {
            compareVal = counter[letter];
            continue;
        }
        if (counter[letter] === compareVal)
            continue;
        if (diffFound)
            return 'NO';
        diffFound = true;
        if (Math.abs(counter[letter] - compareVal) &gt; 1)
            return 'NO';
        if (counter[letter] &lt; compareVal) {
            if (i === 2) {
                compareVal = counter[letter];
            } else {
                return 'NO';
            }
        }  
    }
    return 'YES';
}


Note here we use reduce function to build the letter counter object, eliminating need for separate function. We also slightly optimize the logic to iterate and evaluate the counter, allowing for early exit from that iteration as soon as an invalid condition is encountered.

I probably would not include console logging within the function itself, as I think the function should do only one thing, which is determine if string is valid, not output it as well. Obviously, it is trivial to log the output of this function like

console.log(isValidString(testString));


Be careful in ensuring your function and variables names are meaningful. Your functions are vaguely named and do not specifically convey what caller should expect to happen. 'letterCount' as a variable name would lead me to expect an integer value to be contained therein, not an object with letter counts in it. A simple change to 'letterCounter' would make tremendous difference in conveying meaning of this variable.