If by expression we understand anything that returns a value, a computation that is not an expression must not return value, and by referential transparency can be safely removed. So yes, referential transparency requires that everything is an expression.
But, everything being an expression does not imply that there can be no side effects. For example in the C language there are many expressions that have side effects: take any expression involving the increment and decrement operators ++ and --.
There are a few programming languages with no side effects. Haskell is the most widely used. It uses a clever trick called monads to resolve situations that require modification of state. For example, to print "Hello" on the screen, Haskell doesn't modify the existing universe into one where the word appears on the screen; it creates and returns a new universe where the word is on the screen.