No it's logic first and foremost; speed happens to be the default in other ways, like with division. If it's two integers, don't overthink it: do integer division.
its deciding to do the division first (150/1500=0.1)
That was you. The division is first. Operator precedence rules can get complicated, but they don't come into play here. Just left to right.
The compiler trying to divine your "real" intention would probably lead to more complex problems later on. Overall, it's better for it to do exactly what you ask it to. (Optimizations can be applied if they are provably correct.)
There is no float in the original expression. (And the parentheses around the entire expression are pointless.)
and a float being assigned to the overall calculation
Maybe you need a float for the next calculation, using the result of an integer division.
Being C++ and not C, better to use the appropriate _cast, static_cast in this case. Apply it first, to avoid surprises. Optionally, less redundant with auto.
auto MeterFreshHZ = static_cast<float>(MeterFreshPulses) / ThreadElapsedMS * 1000;
Then again, what is the hertz value used for? In the original example, the answer is exactly 100.0. If you were going to display them, would it make a difference if it was "100Hz" instead of (for example) "100.4Hz"? If not, the order matters (again)
int MeterFreshPulses = 151;
int ThreadElapsedMS = 1504;
int MeterFreshHZ = 1000 * MeterFreshPulses / ThreadElapsedMS;
The multiplication results in a bigger number, which after integer division is less likely to result in a smaller-than-expected number, including zero. Then you have a different potential problem. Will the bigger number be too big and overflow (as mentioned earlier)? Just some of the details to inform your choices when programming in C/C++
One more thing: 1000.0 is actually a double; for a float, it's 1000.0f. Unless you're on AVR, where they're both 32-bit, that can sometimes make a difference
int x = 150;
int y = 1500;
float f = 1e38f * x / y;
Serial.println(f);
f = 1e38 * x / y;
Serial.println(f);
Serial.println(String(f));
Serial.println(String(1e37f));
Serial.println(String(1e37));
prints
inf
ovf
9999999933815812980242299090605229139.32
9999999933815812980242299090605229139.32
10000000000000002220446049250313080847.26
Serial.print has a fairly low hard-coded limit before it gives up and says overflow. The String constructors don't (they call dtostrf).