Yes, unless you click "Apply" in the editor any changes made to a prefab instance are considered as overriding the prefab and do not affect either the prefab or the other instances of the prefab.
Once you instantiate the prefab you can change all aspects of that instance at your discretion. You do it the same exact way you manipulate any other object.
EDIT: To address the specific example you provided.
List<GameObject> cubes = new List<GameObject>();
// Instantiate 5 cubes.
for (int i = 0; i < 5; i++)
{
cubes.Add((GameObject)Instantiate(MyCubePrefab));
}
// Place them in a row, each one bigger than the last.
for (int i = 0; i < cubes.Count; i++)
{
float newScale = 0.5f * i;
float newX = 10 * i;
cubes[i].transform.position = new Vector3(newX, 0, 0);
cubes[i].transform.localScale = new Vector3(newScale, newScale, newScale);
}
All of the above could've (should've) been performed within the same loop but in this example I wanted to stress that each instance is completely separate and manipulating them isn't tied to instantiating them. Note that none of these changes I've made here are carried across to the either the prefab or the other instances of the prefab
Instantiate
call returns a reference to the newly spawned object -- after that, you can add, remove, or edit components just like you would with any other object. \$\endgroup\$