Because you are trying to match string which occurs twice and 'abcdefg' is first correct candidate. I can think only about such approach for your problem:
$ perl -le 'print $x = "abcdefgxxabcdefgzzabcdsjfhkdfab"; print $1 if
+$x =~ /(\w{2,})(.*?\1){2}/;'
abcdefgxxabcdefgzzabcdsjfhkdfab
abcd
$ perl -le 'print $x = "abcdefgxxabcdefgzzabcdsjfhkdfab"; print $1 if
+$x =~ /(\w{2,})(.*?\1){3}/;'
abcdefgxxabcdefgzzabcdsjfhkdfab
ab
$ perl -le 'print $x = "abcdefgxxabcdefgzzabcdsjfhkdfab"; print $1 if
+$x =~ /(\w{2,})(.*?\1){4}/;'
abcdefgxxabcdefgzzabcdsjfhkdfab
I.e. The problem is you have to say exactly how many occurences you want (there is no 'greediness' in this case == you can't say "I want as many occurences as possible", only lowest possible number of occurences will be chosen).