Your solution is a good start.  You could probably make it work without heap allocations in the "functional" style; I prefer putting complex logic into normal for loops though.
Also I don't like assuming input is in ASCII without actually checking - this should work with any string.
You probably could also use String::with_capacity in your code to avoid reallocations in standard cases.
Playground
fn dotted_to_pascal_case(s: &str) -> String {
    let mut result = String::with_capacity(s.len());
    for part in s.split('.') {
        let mut cs = part.chars();
        if let Some(c) = cs.next() {
            result.extend(c.to_uppercase());
        }
        result.push_str(cs.as_str());
    }
    result
}
fn main() {
    println!("{}", dotted_to_pascal_case("foo.bar.baz"));
}