It's more or less as you said, although that's not the whole picture.
For the weather we say
Hace frío. | Hace calor.
These are impersonal sentences; they have no grammatical subject, and the direct object is either frío or calor or a few phrases involving those nouns and modifiers, like un calor terrible or un frío espantoso (note the article).
For the internal feeling of heat or cold experienced by an animate subject (a person, but also maybe an animal), we say things like
Tengo frío. | Ellas tienen frío. | Tuvimos calor. | El gato tiene calor.
These are regular sentences with a subject (implicit or explicit), the verb tener and a direct object: frío or calor. Again you can modify these, e.g. Tuvimos un calor terrible = "We were terribly hot" ("We experienced a terrible heat").
For inanimate things that cannot subjectively experience heat or cold, we can use either estar or ser plus an adjective (frío, caliente, etc.). This is a gigantic topic in itself but mostly the rule is that estar implies a temporal state, while ser implies an essential quality.
La piedra está fría. ("The [=this] stone is [currently] cold.")
La piedra es fría. ("Stone is [essentially] cold.")
Using estar/ser + a temperature adjective with an animate object, like a person, can have several different meanings. For example:
Estás frío. = "You are cold."
This suggests either the literal meaning "I have touched your skin and it's cold", "Your body is cold to the touch", or the figurative meaning "You are aloof, detached, silently angry; you behave coldly, you are distant", etc. It's the same for caliente.
Ella está fría (your example) is not right for your meaning. It would mean either "her body is cold", which without context suggests we're talking about a corpse, or "she's behaving coldly". If you just want to say that she feels cold (she's experiencing cold, and you know it or guess it because she has told you so or because she is shivering and rubbing her hands and the like), then there's only one way to say it, which is Ella tiene frío.*
You wouldn't ever say El café tiene frío, unless you were being playful or poetic, because a cup of coffee is a thing, not an animate being capable of experiencing temperature, and tener frío/calor is only use for that kind of subject. You need to say: El café está frío.
* Actually it's not the only way (you could say also Ella siente frío or Ella está con frío) but you get the point.