Appending String Lengths
JavaScript (ES6), 32 bytes

f=(s,n=0)=&gt;(s+n)[n]?f(s,n+1):s+n


How it works

f = (s, n = 0) =&gt;   // given a string 's' and starting with n = 0:
  (s + n)[n] ?      // if the Nth character of (s + n) exists:
    f(s, n + 1)     //   try again with n + 1
  :                 // else
    s + n           //   return s + n


Starting with N=0, we test the Nth character (0-based) of the string made of the concatenation of the original input string and the decimal representation of N. We increment N until this character doesn't exist anymore.

Example:

N =  0 : abcdefghi0
         ^
N =  1 : abcdefghi1
          ^
N =  2 : abcdefghi2
           ^
...
N =  8 : abcdefghi8
                 ^
N =  9 : abcdefghi9
                  ^
N = 10 : abcdefghi10
                   ^
N = 11 : abcdefghi11    -&gt; success
                    ^


Test cases



f=(s,n=0)=&gt;(s+n)[n]?f(s,n+1):s+n

console.log(f("aaa"));       // -&gt; aaa4
console.log(f(""));          // -&gt; 1
console.log(f("aaaaaaaa"));  // -&gt; aaaaaaaa9
console.log(f("aaaaaaaaa")); // -&gt; aaaaaaaaa11
console.log(f("a1"));        // -&gt; a13