We should profile the amount of new memory allocation when manipulating arbitrary attributes, and organize the API in a way that hints the user into using the most efficient approach. For instance:
v1.attributes["uv"] = new FloatAttributeValue(0.0f, 0.0f);
is less efficient than
var uv = v1.attributes["uv"].asFloat();
uv.data[0] = 0.0f;
uv.data[1] = 0.0f;
but the latter is a bit annoying to write.