Use the power of scripts and ULPs.
When I want all technologies and package combinations to have the same attribute, I use my ATTR_ALL ULP:
#usage "<b><h1>Apply attribute to all package/technology variants</h1></b>\n"
"<pre><b>attr_all</b> <i>name</i> '<i>value</i>'</pre>"
"<p>"
"Sets the indicated attribute for all package and technology combinations of "
"a device. This ULP must be run in the device editor of a library."
string fnam; //script output file name
string cmd; //command to execute at end of ULP
string pack; //package variant name string
string techs[]; //list of technologies
int ntechs; //number of technologies in list
int i; //scratch integer and loop counter
//
// Start of executable program.
//
fnam = argv[0]; //init temp script name to full ULP pathname
fnam = filesetext (fnam, ".scr"); //make script file of same generic name
output (fnam, "wtD") { //open temporary script output file
deviceset (devset) {
devset.devices (dev) {
pack = dev.name;
if (pack == "''") pack = "";
printf ("package '%s';\n", pack);
ntechs = strsplit(techs, dev.technologies, ' ');
for (i = 0; i < ntechs; i++) {
printf ("technology %s;\n", techs[i]);
printf ("attribute %s '%s' constant;\n", argv[1], argv[2]);
} //back for next technology this device
} //back for next DEV in device set
} //end of device set
} //done with output file
cmd = "script " + fnam;
exit (cmd); //run the temporary script
For cases where different variants have slightly different attributes, I use a script to set the attributes the way I want them for one variant, then replicate and edit that chunk of script code for the other variants. That way you only spend time on those things that are different between the variants.
Having a script is also nice when you mess up. When you don't like the result, you can make small incremental changes to the script and re-run the whole thing.
I keep the last script around I used for this purpose as a reminder of the syntax. That makes doing something similar next time simpler. I also have a template script that contains everything for creating one variant of a device. I copy the template to a temporary script and edit as necessary. Most of the time you don't need the full arbitrary device creation, so just delete the parts you don't need. That's a lot easier than looking up the syntax details for commands that aren't there.
Here is my template script:
# Templage script for creating a new device in a library.
#
edit 'xxx.dev';
description '--- description ---';
prefix 'ZZ';
value On;
# ADD symbol swaplevel add-type coordinate;
#
add SYNAME 0 next (0 0);
package PKNAME 'variant';
technology '';
attr manuf 'Megacorp:ABC-123';
attr supplier 'Mouser:666-ABC-123';
# attr qty '1';
# attr bom 'no';
attr valstat 'val';
# attr subst 'no';
attr desc '-- BOM description --';
attr dval '-- BOM value --';
# conn <pin function name> <pad number>
#
# Pad number must be upper case.
#
conn 'name1' '1';
conn 'name2' '2';