The FS architectural register is separate from the FS-base internal register.
As always, using a segment override just selects the segment base associated with that segment, instead of the default DS base or SS base (which are fixed at 0 in 64-bit mode).
The actual value in the fs architectural register itself has nothing to do with it. It only comes into play if you were to mov %fs, %eax to actually read the FS register itself, rather than use the internal base / limit "registers" associated with it.
Since there are ways to set the internal FS base (e.g. with wrmsr or on more recent CPUs the wrfsbase instruction) that are more efficient than mov to %fs (to make it load a base and limit from the GDT or LDT), OSes normally leave FS and GS architectural registers = 0, the null selector.
On bare metal, you can do that, too. Don't bother creating a GDT entry with a base you want and moving a selector into %fs or %gs; just set the base directly with wrmsr or wrfsbase.
What happens if I change fs register without changing fs base?
You can't, AFAIK. mov %reg/mem, %fs will trigger loading the internal segment base / limit registers from the GDT or LDT (depending on the value you mov).
Note that some people call these internal things a "cache", but they're not caches. They're guaranteed to keep the values from when you loaded them, so they'll never happen to change if you change a GDT entry without also reloading the segment register with that selector.
How are the effective address calculations affected?
The same as always. base + index*scale + displacement. Note that an "effective address" is just the offset part of full address, not including the segment selector or base. What is an effective address?
The linear address is also calculated the same as always: segment_base + offset, where the offset part is the effective address specified by the addressing mode.
Addressing modes default to using the DS segment base unless the "base register" in the addressing mode is E/RBP or E/RSP, in which case it's the SS base. But a prefix byte can override the default; that's what the %fs: tells the assembler to emit.