To me it looks like simple math. I think that your second result is wrong.
Here it is in C# as no language was mentioned:
var col1 = new[] { 0xAA0099, 0x339900, 0x006699 };
var col2 = new[] { 0x009966, 0x990066, 0xEF4321 };
for (int i = 0; i < col1.Length; i++)
{
Console.WriteLine($"{col1[i].ToString("X6")} + {col2[i].ToString("X6")} = {(col1[i] + col2[i]).ToString("X6")}");
}
Which outputs:
AA0099 + 009966 = AA99FF
339900 + 990066 = CC9966
006699 + EF4321 = EFA9BA
After talking with ppolymorphe, you could do the following bitwise:
int[] col1 = new int[] { 0xAA0099, 0x339900, 0x006699 };
int[] col2 = new int[] { 0x009966, 0x990066, 0xEF4321 };
uint mask = (1 << 16) - 1;
for (int i = 0; i < col1.Length; i++)
{
var answer = (col1[i] | col2[i]) & mask | 0xaa0000;
Console.WriteLine($"{col1[i].ToString("X6")} ? {col2[i].ToString("X6")} = {answer.ToString("X6")}");
}
Which outputs:
AA0099 ? 009966 = AA99FF
339900 ? 990066 = AA9966
006699 ? EF4321 = AA67B9