There exist many interesting languages that do not have the full expressiveness of Turing Machines: these languages are traditionally called subrecursive.
The typical example is the language of primitive recursive algorithms, provably equivalent to the language of algorithms that can be written with "for-like" statements (fixed step, fixed bounds). Primitive recursive algorithms are total, hence they are not complete (that means that there are total functions not expressible in the formalism). A famous example of a total function not expressible in the primitive recursive setting is Ackermann function.
Other examples of subrecursive languages come from logic. It is well know that no logical system (rich enough to allow to reason about natural numbers) is complete. Hence you cannot expect to prove the totality of all algorithms in them. That is to say that any logical system characterizes a set of computable functions that are provably total in the given system. For instance, the set of computable functions provably total in Peano arithmetics is the so called Goedel's System T (a higher order generalization of primitive recursion); similarly, the set of computable functions provably total in second order arithmetics is Girard's System F, also know as polymorphic lambda calculus.
The interest of considering subrecursive languages consists in the fact of capturing statically , i.e. by the way the program is written, relevant dynamic aspects of the algorithm, such as totality, or complexity properties.
The problem of providing syntactical characterizations of subrecursive complexity classes such as P, Pspace, etc. has received much attention in the literature. The recent field of Implicit Complexity aims at studying the computational complexity of programs with no reference to a particular machine model and explicit bounds on time or memory, but instead relying on logical or computational principles that entail complexity properties, typically via a controlled use of the available resources. For an introduction to this topic, you may consult the special issue on Implicit Computational Complexity, ACM Trans. Comput. Log., Vol 10, n.4 2009.
Other interesting characterizations have been obtained restricting the interpretation of programming languages to finite domains. The seminal result in this area is an old work of Gurevich ("Algebras of feasible functions", FOCS 1983) where he proved that interpreting primitive recursive functions (resp. recursive functions) over finite structures one precisely get the log-space (resp. polynomial time) computable functions.
Please have a look at my article "Computational Complexity via Finite Types", ACM Trans. Comput. Log., Vol 16, n.15 2015, for more references in this area.