Talking about signal termination is like opening a can of worms. This is a HUGE subject that is difficult to summarize in just a couple hundred words. Therefore, I won't. I am going to leave a huge amount of stuff out of this answer. But I will also give you a big warning: There is much misinformation about terminating resistors on the net. In fact, I would say that most of what's found on the net is wrong or misleading. Some day I'll write up something big and post it to my blog, but not today.
The first thing to note is that the resistor value to use for your termination must be related to your trace impedance. Most of the time the resistor value is the same as your trace impedance. If you don't know what the trace impedance is then you should figure it out. There are many online impedance calculators available. A Google search will bring up dozens more.
Most PCB traces have an impedance from 40 to 120 ohms, which is why you found that a 1k termination resistor did almost nothing and a 100-ish ohm resistor was much better.
There are many types of termination, but we can roughly put them into two categories: Source and End termination. Source termination is at the driver, end termination is at the far end. Within each category, there are many types of termination. Each type is best for different uses, with no one type good for everything.
Your termination, a single resistor to ground at the far end, is actually not a very good. In fact, it's wrong. People do it, but it isn't ideal. Ideally that resistor would go to a different power rail at half of your power rail. So if the I/O voltage is 3.3v then that resistor will not go to GND, but another power rail at half of 3.3v (a.k.a. 1.65v). The voltage regulator for this rail has to be special because it needs to source AND sink current, where most regulators only source current. Regulators that work for this use will mention something about termination in the first page of the datasheet.
The big problem with most end-termination is that they consume lots of current. There is a reason for this, but I won't go into it. For low-current use we must look at source termination. The easiest and most common form of source termination is a simple series resistor at the output of the driver. The value of this resistor is the same as the trace impedance.
Source termination works differently than end termination, but the net effect is the same. It works by controlling signal reflections, not preventing the reflections in the first place. Because of this, it only works if a driver output is feeding a single load. If there are multiple loads then something else should be done (like using end termination or multiple source termination resistors). The huge benefit of source termination is that it does not load down your driver like end termination does.
I said before that your series resistor for source termination must be located at the driver, and it must have the same value as your trace impedance. That was an oversimplification. There is one important detail to know about this. Most drivers have some resistance on it's output. That resistance is usually in the 10-30 ohm range. The sum of the output resistance and your resistor must equal your trace impedance. Let's say that your trace is 50 ohms, and your driver has 20 ohms. In this case your resistor would be 30 ohms since 30+20=50. If the datasheets do not say what the output impedance/resistance of the driver is then you can assume it to be 20 ohms-- then look at the signals on the PCB and see if it needs to be adjusted.
Another important thing: when you look at these signals on an o-scope you MUST probe at the receiver. Probing anywhere else will likely give you a distorted waveform and trick you into thinking that things are worse than they really are. Also, make sure that your ground clip is as short as possible.
Conclusion: Switch to source termination with a 33 to 50 ohm resistor and you should be fine. The usual caveats apply.
Following up the comments:
Yes, the frequency is hard-coded into some specific I2C-related registers. At runtime.
That said, your Arduino library might be doing some probing and rise time measurement on the bus for determining a viable clock rate. Let's see.
After doing a bit of source-digging, the answer is in twi.h
#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif
Another piece from that very file:
TWBR = ((CPU_FREQ / TWI_FREQ) - 16) / 2;
Where TWBR stands for Two Wire Baudrate Register I suspect.
I'd call that enough evidence and definitely say, yes your I2C frequency is set directly by your library without any negotiations. If you want to change it, I'd suggest you #define TWI_FREQ before you #include twi.h (or indirectly through Wire.h)
Best Answer
So many questions. Yes, when the signal is not bidirectional, place the resistor close to the source. You should also place a capacitor close to the load. You can start with the capacitor not loaded since it probably won't be needed.
Usually you determine the resistor value experimentally. Typical values for low-speed clocks are 0-56 Ohms. Higher speed clocks use lower values (0-33). The limiting factor is that the series resistor will slow down the rise time as seen at the load. If the resistor is too large, the timing will be off, or, for a clock, the signal will never reach full amplitude, and the system will stop working reliably.
Note that you can sometimes use a ferrite bead instead of a resistor.
For I2C, as long as the series resistor is much smaller than the pullup, it shouldn't have too much effect. For I2C and SPI, you should start with 0 Ohm series resistors and only increase the value if it is needed.
In general, controlling drive strength by internal registers is a much better way to go, because the internal, active circuit drive strength control gives more reduction in emissions with a smaller threat to signal integrity.
There is no formula, but simulation could be helpful to determine the limits of good signal integrity.
Trace length and impedance usually does not matter too much for I2C and SPI if the signals are not going off of the PCB and if your PCB is not unusually large.
Return path is very important for all clock signals. The best scenario is to route clock traces over a solid plane. Do not cross plane split boundaries, or if you do, bridge the split with a small capacitor to provide a low-impedance path for return current. If the plane is not GND, there should be a capacitor at source and load from plane to GND to provide a low-impedance return path. (There is usually already a bypass capacitor at both ends, so most of the time you don't need to worry about adding a capacitor just for the clock signal return current).
I2C seldom causes problems by itself. SPI clock has some potential for causing radiated emissions, especially if you run it off board on a cable.