First you can build a logical vector, give it a meaningful name and use it in a command. This makes your script a little longer, but much easier to read:
interesting_bit = with(aListOfItems, attribute1 & attribute2 == 6 & attribute3 == "C")
In addition, using a little indentation makes the code more readable.
aListOfItems$attribute4[interesting_bit,] <- aListOfItems[interesting_bit,aListOfItems$attribute5] * aListOfItems[interesting_bit,aListOfItems$attribute7]
And using within does more for readability:
aListOfItems[interesting_bit,] = within(aListOfItems[interesting_bit,], { attribute4 = attribute5 * attribute7 }
Also, for logic, there is no need to explicitly test == true :
interesting_bit = aListOfItems$attribute1 & aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"
This ultimately reduces this:
aListOfItems$attribute4([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"),] <- aListOfItems([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"),aListOfItems$attribute5] * aListOfItems([aListOfItems$attribute1 == true & aListOfItems$attribute2 == 6 & aListOfItems$attribute3 == "C"),aListOfItems$attribute7]
(note the additional use of with ):
interesting_bit = with(aListOfItems, attribute1 & attribute2 == 6 & attribute3 == "C") aListOfItems[interesting_bit,] = within(aListOfItems[interesting_bit,], { attribute4 = attribute5 * attribute7 }
This code not only looks less complicated, but also instantly conveys what you are doing, which is very difficult to guess from your source code.