To determine the effect from a qualitative perspective, I threw together a Scala script to brute force all of the combinations for both 4d6 drop lowest and your “keep quadruples” variant, and determine their sums:
val keepallsums = Array.tabulate(6,6,6,6)((w,x,y,z) => {
if (w == x && w == y && w == z) 4*(w+1)
else Array(w,x,y,z).sorted.drop(1).sum + 3
}).flatten.flatten.flatten
val sums = Array.tabulate(6,6,6,6)(Array(_,_,_,_).sorted.drop(1).sum + 3).flatten.flatten.flatten
val counts = Array.tabulate(25)(x => (x, keepallsums count (_ == x), sums count (_ == x)))
counts foreach (x => println(x._1 + " " + x._2 + " " + x._3))
This outputs a space separated data file. The first column is the possible ability score results, the second column is the number of dice combinations that can give that score with the variant, the third is the same for the traditional 4d6 drop lowest:
0 0 0
1 0 0
2 0 0
3 0 1
4 5 4
5 10 10
6 20 21
7 38 38
8 63 62
9 90 91
10 122 122
11 148 148
12 167 167
13 172 172
14 160 160
15 130 131
16 95 94
17 54 54
18 20 21
19 0 0
20 1 0
21 0 0
22 0 0
23 0 0
24 1 0
Already, we can confirm that using the variant there is no chance of starting with a 3 and a small but nonzero chance of starting with 20 or 24. Plotting this data yields two curves (purple is the variant, cyan is the normal 4d6 drop lowest):
These curves are almost completely coincident. This variant rolling scheme, while interesting from a theoretical standpoint, does not raise the expected value of the stats significantly, but it does increase the variance and, most notably, the maximum.