Here's a very literal translation into a fold:
def nodeCopy(e: Elem, args: (Symbol, Any)*): Elem = args.foldLeft(e) {
case (currentElem, (s, v)) =>
currentElem % Attribute(None, s.name, Text(v.toString), Null)
}
This works the same as your implementation, but for arbitrarily many attributes.